python - 访问 Numpy 数组的列?尝试通过转置或通过列访问来执行的错误

标签 python arrays numpy

我有一个 numpy.ndarray 我想访问的列。我将在 8 之后获取所有列并测试它们的方差,如果方差/平均值较低,则删除该列。为此,我需要访问列,最好使用 Numpy。按照我目前的方法,我遇到了错误或转置失败。

为了挖掘这些数组,我使用了 IOPro 适配器,它提供了一个常规的 numpy.ndarray。

import iopro
import sys

adapter = iopro.text_adapter(sys.argv[1], parser='csv')
all_data = adapter[:]
z_matrix = adapter[range(8,len(all_data[0]))][1:3]

print type(z_matrix) #check type
print z_matrix # print array
print z_matrix.transpose() # attempt transpose (fails)
print z_matrix[:,0] # attempt access by column (fails)

谁能解释一下发生了什么?

输出是这样的:

<type 'numpy.ndarray'>
[ (18.712, 64.903, -10.205, -1.346, 0.319, -0.654, 1.52398, 114.495, -75.2488, 1.52184, 111.31, 175.
408, 1.52256, 111.699, -128.141, 1.49227, 111.985, -138.173)
 (17.679, 48.015, -3.152, 0.848, 1.239, -0.3, 1.52975, 113.963, -50.0622, 1.52708, 112.335, -57.4621
, 1.52603, 111.685, -161.098, 1.49204, 113.406, -66.5854)]
[ (18.712, 64.903, -10.205, -1.346, 0.319, -0.654, 1.52398, 114.495, -75.2488, 1.52184, 111.31, 175.
408, 1.52256, 111.699, -128.141, 1.49227, 111.985, -138.173)
 (17.679, 48.015, -3.152, 0.848, 1.239, -0.3, 1.52975, 113.963, -50.0622, 1.52708, 112.335, -57.4621
, 1.52603, 111.685, -161.098, 1.49204, 113.406, -66.5854)]
Traceback (most recent call last):
  File "z-matrix-filtering.py", line 11, in <module>
    print z_matrix[:,0]
IndexError: too many indices

出了什么问题?有没有更好的方法来访问列?我将读取文件的所有行,测试从第 8 列开始的所有列是否存在显着差异,删除任何差异不大的列,然后将结果重新打印为新的 CSV。

编辑: 根据回复,我创建了以下非常丑陋且我认为空洞的方法。

all_data = adapter[:]
z_matrix = []

for line in all_data:
    to_append = []
    for column in range(8,len(all_data.dtype)):
        to_append.append(line[column].astype(np.float16))
    z_matrix.append(to_append)

z_matrix = np.array(z_matrix)

必须直接访问列的原因是数据内部有一个String。如果未以某种方式绕过此字符串,则会抛出有关使用缓冲区错误的对象成员的空数组的错误。 有更好的解决方案吗?这看起来很糟糕,而且对于几千兆字节的数据来说似乎效率很低。

最佳答案

请注意 print z_matrix 的输出具有以下形式

[ (18.712, 64.903, ..., -138.173)
  (17.679, 48.015, ..., -66.5854)]

也就是说,它被打印为一个元组列表。这是当数组是“结构化数组”时得到的输出。它是一个一维结构数组。数组中的每个“元素”都有 18 个字段。发生错误是因为您试图将一维数组作为二维数组进行索引; z_matrix[:,0] 将不起作用。

打印数组的数据类型,查看详情。例如

print z_matrix.dtype

这应该显示字段的名称及其各自的数据类型。

您可以获得其中一个元素,例如 z_matrix[k](其中 k 是一个整数),或者您可以访问“列”(实际上是结构化数组的一个字段)作为 z_matrix['name'](将 'name' 更改为 dtype 中的字段之一)。

如果所有字段都具有相同的数据类型(看起来像这里的情况——每个字段的类型都是 np.float64),您可以通过 reshape 来创建数据的二维 View view 方法的结果。例如:

z_2d = z_matrix.view(np.float64).reshape(-1, len(z_matrix.dtype.names))

另一种通过列号而不是名称获取数据的方法是:

col = 8  # The column number (zero-based).
col_data = z_matrix[z_matrix.dtype.names[col]]

有关结构化数组的更多信息,请参阅 http://docs.scipy.org/doc/numpy/user/basics.rec.html .

关于python - 访问 Numpy 数组的列?尝试通过转置或通过列访问来执行的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19849635/

相关文章:

python - 异常 : @error: Max Equation Length in Gekko

python - 构造函数 B 未在 A -> B -> C 继承链中调用

python - 如何修复重新声明的警告?

javascript - 合并/展平多维数组并删除重复的Javascript

python - stats.scipy.chi2 返回值 0.0

python - 批量删除联系人报 "If-Match or If-None-Match header or entry etag attribute required"错误

c - 在C中,如何存储长字符串(例如密码)

javascript - 循环数组中的对象,显示 JSON 数据

python - 将不同维度的数组 append 到单个数组

python - numpy 向量化并行更新