NumPy无法识别井阵形状

时间:2017-03-15 13:00:25

标签: python-3.x numpy

我的代码如下:

data = np.array([[[i, j], i * j] for i in range(10) for j in range(10)])
print(data)

x = np.array(data[:,0])
x1 = x[:,0]
x2 = x[:,1]
print(x)

data正确输出[[[0,0],0],[[0,1],0],[[0,2],0],...,[[9,9],81]],顺便说一下,这是乘法表及其结果。

因此,data的第一列(x)必须分为x1x2,分别是其中的第一列和最后一列。我认为我做得对,但它引发了一个错误too many indices for array。我做错了什么?

2 个答案:

答案 0 :(得分:1)

data.dtypeobject,因为[[i,j],k]的元素不是同质的。解决方法:

data = np.array([(i, j, i * j) for i in range(10) for j in range(10)])
print(data)

x1 = data[:,:2]
x2 = data[:,2]

data.shape现在是(100,3)data.dtypeintx1x2是您想要的。

答案 1 :(得分:1)

由于列表长度的混合,这会产生一个对象数组:

In [97]: data = np.array([[[i, j], i * j] for i in range(3) for j in range(3)])
In [98]: data
Out[98]: 
array([[[0, 0], 0],
       [[0, 1], 0],
       [[0, 2], 0],
       [[1, 0], 0],
       [[1, 1], 1],
       [[1, 2], 2],
       [[2, 0], 0],
       [[2, 1], 2],
       [[2, 2], 4]], dtype=object)
In [99]: data.shape
Out[99]: (9, 2)

一列包含数字(但仍为对象dtype),其他列表。两者都有(9,)形状

In [100]: data[:,1]
Out[100]: array([0, 0, 0, 0, 1, 2, 0, 2, 4], dtype=object)
In [101]: data[:,0]
Out[101]: 
array([[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2], [2, 0], [2, 1],
       [2, 2]], dtype=object)

将该列转换为数字数组的最简单方法是通过.tolist

In [104]: np.array(data[:,0].tolist())
Out[104]: 
array([[0, 0],
       [0, 1],
       [0, 2],
       [1, 0],
       [1, 1],
       [1, 2],
       [2, 0],
       [2, 1],
       [2, 2]])
In [105]: _.shape
Out[105]: (9, 2)

其他答案中建议的[i, j, i * j]元素更易于使用。

用于生成此类表格的结构化数组方法'

In [113]: dt='(2)int,int'
In [114]: data = np.array([([i, j], i * j) for i in range(3) for j in range(3)],
     ...: dtype=dt)
In [115]: data
Out[115]: 
array([([0, 0], 0), ([0, 1], 0), ([0, 2], 0), ([1, 0], 0), ([1, 1], 1),
       ([1, 2], 2), ([2, 0], 0), ([2, 1], 2), ([2, 2], 4)], 
      dtype=[('f0', '<i4', (2,)), ('f1', '<i4')])
In [116]: data['f0']
Out[116]: 
array([[0, 0],
       [0, 1],
       [0, 2],
       [1, 0],
       [1, 1],
       [1, 2],
       [2, 0],
       [2, 1],
       [2, 2]])
In [117]: data['f1']
Out[117]: array([0, 0, 0, 0, 1, 2, 0, 2, 4])