添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

如何对一个由numpy.void数字组成的numpy.ndarray进行切片?

3 人关注

那么问题来了:我有变量 x ,这是一个 numpy.ndarray 。这个结构的大小是1000。如果我做 x[0] ,那么我得到一个 numpy.void ,有4个数字。如果我做 x[1] ,那么我得到另一个 numpy.void ,也是4个数字,等等。

我只想做什么。我想把这个数据结构切片,这样我就能提取一个1000x3大小的numpy矩阵。

我怎么做呢?谢谢

python
numpy
matrix
array-broadcasting
Spacey
Spacey
发布于 2017-06-01
1 个回答
hpaulj
hpaulj
发布于 2017-06-01
已采纳
0 人赞同

听起来你有一个结构化的数组,就像这个简单的例子。

In [158]: x = np.ones((5,), dtype='i,i,f,f')
In [159]: x
Out[159]: 
array([(1, 1,  1.,  1.), (1, 1,  1.,  1.), (1, 1,  1.,  1.),
       (1, 1,  1.,  1.), (1, 1,  1.,  1.)], 
      dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<f4'), ('f3', '<f4')])
In [160]: x[0]
Out[160]: (1, 1,  1.,  1.)
In [161]: type(x[0])
Out[161]: numpy.void

x[0]是一条记录,以元组形式显示。 你可以通过名字访问字段(而不是通过 "列 "索引)。

In [162]: x['f0']
Out[162]: array([1, 1, 1, 1, 1], dtype=int32)
In [163]: x['f2'] = np.arange(5)
In [165]: x['f1'] = [10,12,8,0,3]
In [166]: x
Out[166]: 
array([(1, 10,  0.,  1.), (1, 12,  1.,  1.), (1,  8,  2.,  1.),
       (1,  0,  3.,  1.), (1,  3,  4.,  1.)], 
      dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<f4'), ('f3', '<f4')])
In [168]: x[['f2','f3']]    # 2 fields at once
Out[168]: 
array([( 0.,  1.), ( 1.,  1.), ( 2.,  1.), ( 3.,  1.), ( 4.,  1.)], 
      dtype=[('f2', '<f4'), ('f3', '<f4')])

当 "列 "应该包含不同的东西时,这是很方便的,例如,字符串在一个列中,整数在另一个列中。 但是,将这样的数组转换为相同数字类型的2d数组可能会很尴尬。

替换代码3】和astype在有限的情况下工作,但tolist是我所知道的最强大的转换媒介。

In [179]: x.tolist()
Out[179]: 
[(1, 10, 0.0, 1.0),
 (1, 12, 1.0, 1.0),
 (1, 8, 2.0, 1.0),
 (1, 0, 3.0, 1.0),
 (1, 3, 4.0, 1.0)]
In [180]: np.array(x.tolist())
Out[180]: 
array([[  1.,  10.,   0.,   1.],
       [  1.,  12.,   1.,   1.],
       [  1.,   8.,   2.,   1.],
       [  1.,   0.,   3.,   1.],
       [  1.,   3.,   4.,   1.]])