为什么在使用数组迭代和提取元素时在列表中打印array([])?

时间:2019-03-06 21:10:18

标签: python python-3.x numpy

看我是否可以使用推导或数组运算符,而不是for循环。

r currentproject
  

OUTPUT = [[array([1,2]),array([2,4])]]

我想要一个列表或数组= [2,12]

之后我可以将列表转换为一维数组。 数组中每一行的第一个元素*第二个元素。

我希望它适用于任何二维数组的一般情况。

4 个答案:

答案 0 :(得分:3)

看一下动作-逐步:

In [170]: b.shape                                                               
Out[170]: (2, 2)
In [171]: b[0:1]                                                                
Out[171]: array([[1, 2]])              # (1,2) array
In [172]: [z for z in b[0:1]]                                                   
Out[172]: [array([1, 2])]              # iteration on 1st, size 1 dimension
In [173]: [[x for x in z] for z in b[0:1]]                                      
Out[173]: [[1, 2]]
In [174]: [[x*z for x in z] for z in b[0:1]]                                    
Out[174]: [[array([1, 2]), array([2, 4])]]

您正在做[1*np.array([1,2]), 2*np.array([1,2])]

使用b[0:1]切片,您甚至都没有碰到b的第二行。

但是更简单的列表理解可以做到:

In [175]: [i*j for i,j in b]     # this iterates on the rows of b                                               
Out[175]: [2, 12]

In [176]: b[:,0]*b[:,1]                                                         
Out[176]: array([ 2, 12])

答案 1 :(得分:1)

最简单的方法是在numpy中使用prod函数。

from numpy import prod

a = [[1,2],[3,4]]
b = [prod(x) for x in a] 
print(b)

输出:

[2,12]

答案 2 :(得分:1)

要部分回答问题。

    1. 为什么要打印array([])...?

您使用的numpy数组是带有__repr____str__方法的类,当您将其作为print语句中的参数时,该方法将决定所看到的内容。 / p>

在numpys数组中,类似以下内容:

def __repr__(self):
    return self.__class__.__name__ + "(" + repr(self.array) + ")"
  • 2 ...在使用数组的列表中...

列表或字典在其__repr__方法中调用子元素__repr__方法。

    1. ...并从中提取元素?

在内部x*z中,您将x(一个数字(1或2))与z乘以一个1x2数组(b[0:1] = array([[1, 2]]))。结果就是一个数组,它本身就是一个数组,乘以其每个元素作为标量([[1*1, 1*2]], [2*1, 2*2]]

针对您的问题的其他解决方案(但可能已经提到过的产品肯定会更快;)):

import numpy as np

a=[[1,2],[3,4]]

b=np.array(a)

c=[[z1*z2] for z1, z2 in b]

print(c)

答案 3 :(得分:1)

您可以将第一列与第二列相乘:

c = b[:, 0] * b[:, 1]

或者您可以使用np.multiply

c = np.multiply.reduce(b[:, :2], axis=1)