繁体   English   中英

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

[英]How can I get Numpy to give an array of lists instead of tuples?

当我用数据制作一个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')])

正如@Ashwini所说,这些既不是列表列表也不是元组列表,它们都是numpy数组。 您仍然可以从该新数组访问“列”(此处实际称为“字段”)和“行”(实际上称为“记录”)。 我不建议将其转换为任何列表。

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')])

尽管第二个数组不是元组列表(比第一个数组多),但它在纯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()]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM