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