numpy一次性切片2D数组的内部数组

时间:2017-09-06 19:59:27

标签: python arrays numpy slice

考虑下面的数组(编辑:数组的格式是因为我从另一个源获取此数据,基本上数据是嵌套的不等元素列表列表)

eg = array([
   [ list(['Vehicle Sales Anfavea units','Brazil','184,815.00'])],
   [ list(['Commodity Price Index MoM % m/m', 'Brazil', '-0.58'])],
   [ list(['Commodity Price Index YoY % y/y', 'Brazil', '0.54'])]
 ], dtype=object)

如何在single attempt中对此数组进行切片以获取每行中的最后两个元素?我想要的输出应该是

([
['Brazil','184,815.00'],
['Brazil', '-0.58'],
['Brazil', ''0.54']
])

4 个答案:

答案 0 :(得分:0)

好的,所以按原样记录数据,

import numpy as np
eg = np.array([
   [ list(['Vehicle Sales Anfavea units','Brazil','184,815.00'])],
   [ list(['Commodity Price Index MoM % m/m', 'Brazil', '-0.58'])],
   [ list(['Commodity Price Index YoY % y/y', 'Brazil', '0.54'])]
 ], dtype=object)

您只需运行以下一个班轮即可获得所需的值。

x = [ i.tolist() for i in [i[0][1:] for i in eg] ]

[i[0][1:] for i in eg]解析列表列表,i.tolist()np.array值转换为list

>>> 
>>> x
[['Brazil', '184,815.00'], ['Brazil', '-0.58'], ['Brazil', '0.54']]

答案 1 :(得分:0)

这是一种方式,你会得到一些"嵌套"虽然:

In [1]: from numpy import array

In [2]: eg = array([
   ...:    [ list(['Vehicle Sales Anfavea units','Brazil','184,815.00'])],
   ...:    [ list(['Commodity Price Index MoM % m/m', 'Brazil', '-0.58'])],
   ...:    [ list(['Commodity Price Index YoY % y/y', 'Brazil', '0.54'])]
   ...:  ], dtype=object)

In [3]: eg[:,:,-2:]
Out[3]:
array([[['Brazil', '184,815.00']],

       [['Brazil', '-0.58']],

       [['Brazil', '0.54']]], dtype=object)

然而,你可以挤压"它:

In [4]: import numpy as np

In [5]: np.squeeze(eg[:,:,-2:])
Out[5]:
array([['Brazil', '184,815.00'],
       ['Brazil', '-0.58'],
       ['Brazil', '0.54']], dtype=object)

答案 2 :(得分:0)

它看起来像一个(3,1)对象数组的显示,包含3个列表:

In [168]: arr = np.zeros((3,1),object)
In [169]: arr[:,0]=[['Vehicle Sales Anfavea units','Brazil','184,815.00'],['Comm
     ...: odity Price Index MoM % m/m', 'Brazil', '-0.58'],['Commodity Price Ind
     ...: ex YoY % y/y', 'Brazil', '0.54']]
In [170]: arr
Out[170]: 
array([[list(['Vehicle Sales Anfavea units', 'Brazil', '184,815.00'])],
       [list(['Commodity Price Index MoM % m/m', 'Brazil', '-0.58'])],
       [list(['Commodity Price Index YoY % y/y', 'Brazil', '0.54'])]], dtype=object)

一个简单的copy-n-paste创建一个(3,1,3)数组对象(字符串);不是列表的二维数组。

由于您需要一部分列表,因此您将使用列表推导

In [171]: [a[-2:] for a in arr.ravel()]
Out[171]: [['Brazil', '184,815.00'], ['Brazil', '-0.58'], ['Brazil', '0.54']]
In [172]: np.array(_)
Out[172]: 
array([['Brazil', '184,815.00'],
       ['Brazil', '-0.58'],
       ['Brazil', '0.54']],
      dtype='<U10')

请注意,这个最终数组是(3,2)字符串dtype,而不是列表的对象数组。

另一种方法是将其转换为2d字符串数组,并索引:

In [174]: np.stack(arr.ravel())
Out[174]: 
array([['Vehicle Sales Anfavea units', 'Brazil', '184,815.00'],
       ['Commodity Price Index MoM % m/m', 'Brazil', '-0.58'],
       ['Commodity Price Index YoY % y/y', 'Brazil', '0.54']],
      dtype='<U31')
In [175]: _.shape
Out[175]: (3, 3)
In [176]: __[:,-2:]
Out[176]: 
array([['Brazil', '184,815.00'],
       ['Brazil', '-0.58'],
       ['Brazil', '0.54']],
      dtype='<U31')

有关在How to turn array of array into single high dimension array?

使用stack的更多信息

要保持列表结构的对象数组,就地替换可能是最简单的:

In [180]: arr1=arr.copy()
In [181]: arr1.shape
Out[181]: (3, 1)
In [182]: for a in arr1.ravel():
     ...:     a[:] = a[-2:]
     ...:     
In [183]: arr1
Out[183]: 
array([[list(['Brazil', '184,815.00'])],
       [list(['Brazil', '-0.58'])],
       [list(['Brazil', '0.54'])]], dtype=object)

答案 3 :(得分:0)

您的数组可能看起来像

>>> print(*[' '.join(map(str, [n for n in range(1, n+1) for n in [n]*n])) for n in range(1, n+1)], sep='\n')
1
1 2 2
1 2 2 3 3 3

但运行该代码不会重现您的数组,并尝试将子列表切片,就好像它们是数组结构的一部分一样无法工作。

你有一个对象dtype的二维数组,其元素是列表。从版本1.13开始,NumPy将在array([ [ list(['Vehicle Sales Anfavea units','Brazil','184,815.00'])], [ list(['Commodity Price Index MoM % m/m', 'Brazil', '-0.58'])], [ list(['Commodity Price Index YoY % y/y', 'Brazil', '0.54'])] ], dtype=object) 视图中明确显示list(...)数组内的列表,但如果您尝试执行{repr,则NumPy不会看到list(...)符号代表作为代码,它将从输入中推断出数组的深度,通常不会保留列表。

您需要消除冗余单例维度,将列表数组转换为普通的多维数组,然后切片:

repr