我有一个 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。如果此字符串没有以某种方式被规避,则会抛出一个关于 void-array 的错误,其中对象成员使用缓冲区错误。有更好的解决方案吗?这看起来很糟糕,而且对于几 GB 的数据似乎效率很低。