Python 一次性对二维阵列的内部阵列进行numpy切片

Python 一次性对二维阵列的内部阵列进行numpy切片,python,arrays,numpy,slice,Python,Arrays,Numpy,Slice,考虑下面的数组(编辑:数组的格式是因为我从另一个源获取此数据,基本上数据是不等元素列表的嵌套列表) 如何在一次尝试中切片此数组以获取每行中的最后两个元素?我想要的输出应该是 ([ ['Brazil','184,815.00'], ['Brazil', '-0.58'], ['Brazil', ''0.54'] ]) 好的,那么就照原样把你的数据 import numpy as np eg = np.array([ [ list(['Vehicle Sales Anfavea units'

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

如何在
一次尝试中切片此数组以获取每行中的最后两个元素?我想要的输出应该是

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

好的,那么就照原样把你的数据

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

这里有一种方法,您将得到一些“嵌套”:

但是,您可以“挤压”它:


它看起来像(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)
简单的复制粘贴创建(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')

您的数组可能看起来像

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)
但是,以代码的形式运行它将不会复制您的数组,并且尝试将子列表作为数组结构的一部分进行切片是行不通的

您有一个对象数据类型的二维数组,其元素是列表。从1.13版开始,NumPy将在
repr
视图中显式显示数组中列表的
list(…)
,但如果您尝试以代码形式执行
repr
表示,NumPy将看不到
list(…)
符号,并且它将从输入推断数组的深度,通常不保留列表


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

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

您是有意为一个元素列表
[列表(['Vehicle Sales Anfavea units'、'Brazil'、'184815.00'])
还是您实际上指的是
['Vehicle Sales Anfavea units'、'Brazil'、'184815.00']
?在后一种情况下,答案是
eg[:,[1,2]]
。在前一种情况下,
eg[:,0,[1,2]]
。这不是2D数组。在继续之前,您可能需要熟悉构造列表和数组的语法;
列表
调用是多余的,
列表
调用周围的括号很可能没有做任何你想做的事情。我明白了,但是这个数组的格式是因为我从另一个源获取数据。你是说这是数组的
repr
?这与您实际执行发布的代码时有很大不同。我很确定,如果它有明确的
列表
符号,它会在
repr
中说
dtype=object
;你的是(3,1,3),而不是(3,2)列表。我复制粘贴了他的示例。
np.array(arr.tolist())
是将列表对象数组转换为常规数组的便捷方法,尽管我不能说它是否最有效。
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')
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')
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)
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)
eg = eg[:, 0]
eg = numpy.array(eg.tolist())
eg = eg[:, 1:]