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