2D阵列的Numpy切片内部阵列



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

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

看起来像一个(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)

一个简单的复制n-paste创建了(3,1,3)数组对象(字符串);不是列表的2D阵列。

由于您想要列表的切片,您将使用列表理解

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

更多关于如何将数组数组变成单个高维数组的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)

好的,因此请按原样获取数据,

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

这是一种方法,但是您会得到一些"嵌套":

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)

您的数组可能看起来像

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)

但是,将其运行为代码不会重现您的数组,并试图切成符号符号,就好像它们是数组结构的一部分一样行不通的。

您有一个二维对象dtype的二维数组,其元素是列表。由于版本1.13,Numpy将在repr视图中的数组中明确显示list(...),但是如果您尝试将repr表示为代码,则Numpy将不会看到list(...)表示法,并且它将推断出数组的深度输入,通常不保留列表。


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

eg = eg[:, 0]
eg = numpy.array(eg.tolist())
eg = eg[:, 1:]

最新更新