我有一个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抛出错误。 有更好的解决方案吗?这看起来很糟糕,而且对于几千兆字节的数据来说似乎效率低下。
答案 0 :(得分:5)
请注意print z_matrix
的输出格式为
[ (18.712, 64.903, ..., -138.173)
(17.679, 48.015, ..., -66.5854)]
也就是说,它被打印为元组列表。这是当数组是“结构化数组”时得到的输出。它是一维结构阵列。数组中的每个“元素”都有18个字段。发生此错误的原因是您尝试将1-D数组索引为2-D; z_matrix[:,0]
无效。
打印阵列的数据类型以查看详细信息。 E.g。
print z_matrix.dtype
这应该显示字段的名称及其各自的数据类型。
您可以获取其中一个元素,例如z_matrix[k]
(其中k
是整数),或者您可以访问“列”(实际上是结构化数组的字段) z_matrix['name']
(将'name'
更改为dtype中的某个字段)。
如果这些字段都具有相同的数据类型(这里的情况类似 - 每个字段都有np.float64
类型),则可以通过重新整形{的结果来创建数据的二维视图{1}}方法。例如:
view
按列号而不是名称获取数据的另一种方法是:
z_2d = z_matrix.view(np.float64).reshape(-1, len(z_matrix.dtype.names))
有关结构化数组的更多信息,请参阅http://docs.scipy.org/doc/numpy/user/basics.rec.html。
答案 1 :(得分:1)
z_matrix
的显示与形状(2,)
一致,是1d元组数组。
np.array([np.array(a) for a in z_matrix])
生成(2,18)
2d数组。您应该可以对其进行列测试。
答案 2 :(得分:0)
访问numpy数组非常容易。这是一个有用的简单例子
import numpy as n
A = n.array([[1, 2, 3], [4, 5, 6]])
print A
>>> array([[1, 2, 3],
[5, 6, 7]])
A.T // To obtain the transpose
>>> array([[1, 5],
[2, 6],
[3, 7]])
n.mean(A.T, axis = 1) // To obtain column wise mean of array A
>>> array([ 3., 4., 5.])
我希望这可以帮助您执行转置和列式操作