我想切片一个numpy结构化数组。 我有一个数组
>>b
>>array([([11.0, 21.0, 31.0, 0.01], [1.0, 2.0, 3.0, 0.0]),
([41.0, 51.0, 61.0, 0.11], [4.0, 5.0, 6.0, 0.1]),
([71.0, 81.0, 91.0, 0.21], [7.0, 8.0, 9.0, 0.2])],
dtype=[('fd', '<f8', (4,)), ('av', '<f8', (4,))])
我想访问此元素以创建类似于
的新数组>>b[:][:,0]
获取与此类似的数组。 (要获取[0]中所有列中的所有行)。 (请注意以下括号,括号和尺寸,因为这不是输出)
>>array([([11.0],[1.0]),
([41.0],[4.0]),
([71.0],[7.0])],
dtype=[('fd', '<f8', (1,)), ('av', '<f8', (1,))])
但是我收到了这个错误。
>>b[:][:,0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: too many indices for array
我想在没有循环dtype中的名称的情况下这样做。 非常感谢你的帮助。
答案 0 :(得分:2)
您可以按字段名称访问结构化数组的字段。没有办法解决这个问题。除非dtypes允许您以不同的方式查看它。
让我们调用您的欲望输出c
。
In [1061]: b['fd']
Out[1061]:
array([[ 1.10000000e+01, 2.10000000e+01, 3.10000000e+01,
1.00000000e-02],
[ 4.10000000e+01, 5.10000000e+01, 6.10000000e+01,
1.10000000e-01],
[ 7.10000000e+01, 8.10000000e+01, 9.10000000e+01,
2.10000000e-01]])
我认为您要做的是为这两个字段收集这些值:
In [1062]: b['fd'][:,0]
Out[1062]: array([ 11., 41., 71.])
In [1064]: c['fd']
Out[1064]:
array([[ 11.],
[ 41.],
[ 71.]])
正如我在https://stackoverflow.com/a/38090370/901925中所解释的那样,recfunctions
通常会按目标分配目标数组并复制值。
因此,字段迭代解决方案将类似于:
In [1066]: c.dtype
Out[1066]: dtype([('fd', '<f8', (1,)), ('av', '<f8', (1,))])
In [1067]: b.dtype
Out[1067]: dtype([('fd', '<f8', (4,)), ('av', '<f8', (4,))])
In [1068]: d=np.zeros((b.shape), dtype=c.dtype)
In [1070]: for n in b.dtype.names:
d[n][:] = b[n][:,[0]]
In [1071]: d
Out[1071]:
array([([11.0], [1.0]), ([41.0], [4.0]), ([71.0], [7.0])],
dtype=[('fd', '<f8', (1,)), ('av', '<f8', (1,))])
=====
由于两个字段都是浮点数,我可以将b
视为2d数组;并选择带有2d数组索引的2个子列:
In [1083]: b.view((float,8)).shape
Out[1083]: (3, 8)
In [1084]: b.view((float,8))[:,[0,4]]
Out[1084]:
array([[ 11., 1.],
[ 41., 4.],
[ 71., 7.]])
同样,c
可以被视为2d
In [1085]: c.view((float,2))
Out[1085]:
array([[ 11., 1.],
[ 41., 4.],
[ 71., 7.]])
我可以,然后使用以下内容将值移至空白d
In [1090]: d=np.zeros((b.shape), dtype=c.dtype)
In [1091]: d.view((float,2))[:]=b.view((float,8))[:,[0,4]]
In [1092]: d
Out[1092]:
array([([11.0], [1.0]), ([41.0], [4.0]), ([71.0], [7.0])],
dtype=[('fd', '<f8', (1,)), ('av', '<f8', (1,))])
所以,至少在这种情况下,我们不必进行现场复制。但我不能说,没有测试,哪个更快。在我之前的回答中,我发现在处理许多行时,字段副本的字段相对较快。