当我从我的数据中创建一个numpy数组时,我得到(正如预期的)列表列表,但是当我为它们声明数据类型时,我得到的似乎是元组列表,这是不好的。这是一个问题,因为numpy似乎认为第一个数组是2D数组,而第二个数组是1D数组(它将.shape
作为(9,)
。我希望能够维护2D数组的可用性,但给它的数据类型如下。有没有办法做到这一点?
>>> np.array(mtest)
array([[',', '7.174707364110744'],
['the', '5.260736372733581'],
['.', '2.630943297842565'],
['of', '2.505952403774265'],
['and', '2.309647686709941'],
['a', '1.7517895552087845'],
['to', '1.7414375486448457'],
[';', '1.5612359529022042']],
dtype='<U18')
>>> np.array(mtest, dtype=[('token', np.unicode_, 64),('perc', np.float)])
array([(',', 7.174707364110744), ('the', 5.260736372733581),
('.', 2.630943297842565), ('of', 2.505952403774265),
('and', 2.309647686709941), ('a', 1.7517895552087845),
('to', 1.7414375486448457), (';', 1.5612359529022042)],
dtype=[('token', '<U64'), ('perc', '<f8')])
答案 0 :(得分:2)
正如@Ashwini评论的那样,这些既不是列表列表也不是元组列表,它们都是numpy数组。您仍然可以访问&#34;列&#34; (实际上称为&#34;字段&#34;,此处)和&#34;行&#34; (实际上称为&#34;记录&#34;)来自该新阵列。我不建议将其转换为任何列表。
a = np.array(mtest, dtype=[('token', np.unicode_, 64),('perc', np.float)])
>>> a['token']
array([',', 'the', '.', 'of', 'and', 'a', 'to', ';'],
dtype='<U64')
>>> a['perc']
array([ 7.17470736, 5.26073637, 2.6309433 , 2.5059524 , 2.30964769,
1.75178956, 1.74143755, 1.56123595])
>>> a[2]
('.', 2.630943297842565)
以上不是元组:
>>> type(a[2])
numpy.void
>>> a[2].dtype
dtype([('token', '<U64'), ('perc', '<f8')])
答案 1 :(得分:0)
虽然第二个数组不是元组列表(除了第1个列表是列表之外),但它在纯Python中的表达式是。这对dtype
来说不是问题。这就是numpy
程序员选择构建此接口的方式。
要创建第一个2d数组,我可以从列表列表开始:
x1 = array([[',', '7.174707364110744'],
['the', '5.260736372733581'],
...
[';', '1.5612359529022042']],
dtype='<U18')
使用字段创建第二个,我必须将其转换为元组列表:
list_of_tuples=[(r[0],float(r[1])) for r in x1]
x2=np.array(list_of_tuples,dtype=[('token', np.unicode_, 64),('perc', np.float)])
x2.tolist()
制造
[(u',', 7.174707364110744),
...
(u'to', 1.7414375486448457),
(u';', 1.5612359529022042)]
尝试使用列表列表会产生'expected a readable buffer object'
错误。
x2
的元素是一个numpy数组,形状()
。而x1
行的形状为(2,)
。 x2[2]
不仅显示为元组,而且只能分配一个元组:
x2[2]=(',',1.3)
但它不是一成不变的(就像一个真正的元组)
x2[2][0] = ';'
x2[2]['token']
如果它是一个真正的元组,那么这个赋值会产生一个错误,如:
x2[2].tolist()[0]=':' # TypeError
如果您需要第二个数组的列表表达式列表,请使用
[list(r) for r in x2.tolist()]