我怎样才能让Numpy给出一系列列表而不是元组?

时间:2014-11-15 15:34:12

标签: python arrays numpy

当我从我的数据中创建一个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')])

2 个答案:

答案 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()]