如何分割由 numpy.void 个数字组成的 numpy.ndarray?
How to slice a numpy.ndarray made up of numpy.void numbers?
事情是这样的:我有变量 x
,它是一个 numpy.ndarray
。这个结构的大小是 1000。如果我做 x[0]
,那么我得到一个 numpy.void
,有 4 个数字。如果我这样做 x[1]
,那么我会得到另一个 numpy.void
,也是 4 个数字,等等
我只想做的事情:我想对这个数据结构进行切片,以便提取一个大小为 1000x3 的 numpy 矩阵。
我该怎么做?谢谢
听起来你有一个结构化数组,类似于这个简单的例子:
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]
是一条记录,显示为一个元组。您按名称访问字段(而不是 'column' 索引):
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')])
当 'columns' 应该包含不同的东西时,这很方便,例如一个包含字符串,另一个包含整数。但是将这样的数组转换为相同数值类型的二维数组可能会很尴尬。
view
和 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.]])
请注意,结构化数组的 tolist
是一个元组列表,而二维数组的 tolist
是一个列表列表。朝着这个方向前进,差异并不重要。反过来说,区别很重要。
你是如何生成这个数组的?来自 csv
和 genfromtxt
?作为其他一些数字包的输出?
事情是这样的:我有变量 x
,它是一个 numpy.ndarray
。这个结构的大小是 1000。如果我做 x[0]
,那么我得到一个 numpy.void
,有 4 个数字。如果我这样做 x[1]
,那么我会得到另一个 numpy.void
,也是 4 个数字,等等
我只想做的事情:我想对这个数据结构进行切片,以便提取一个大小为 1000x3 的 numpy 矩阵。
我该怎么做?谢谢
听起来你有一个结构化数组,类似于这个简单的例子:
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]
是一条记录,显示为一个元组。您按名称访问字段(而不是 'column' 索引):
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')])
当 'columns' 应该包含不同的东西时,这很方便,例如一个包含字符串,另一个包含整数。但是将这样的数组转换为相同数值类型的二维数组可能会很尴尬。
view
和 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.]])
请注意,结构化数组的 tolist
是一个元组列表,而二维数组的 tolist
是一个列表列表。朝着这个方向前进,差异并不重要。反过来说,区别很重要。
你是如何生成这个数组的?来自 csv
和 genfromtxt
?作为其他一些数字包的输出?