用一组标量划分数组数组

时间:2014-02-02 20:03:10

标签: python arrays numpy multidimensional-array

如果我有一个数组,A,形状(n,m,o)和数组B,形状(n,m),有一种方法可以将每个数组除以A [n,m] B [n,m]的标量没有列表理解?

>>> A.shape
(4,173,1469)
>>> B.shape
(4,173)
>>> # Better way to do:
>>> np.array([[A[i, j] / B[i, j] for j in range(len(B[i]))] for i in range(len(B))])

列表理解的问题在于它很慢,它不会返回一个数组(所以你必须np.array(_)它,这使得它更慢),它很难读,整个numpy的目的是将循环从Python移动到C ++或Fortran。

如果A是形状(n)而B是标量(形状()),那么这将是微不足道的:A / B,但是这个属性不能按尺寸缩放

>>> A / B
ValueError: operands could not be broadcast together with shapes (4,173,1469) (4,173) 

我正在寻找一种快速的方法来做到这一点(最好不要将B平铺到一个形状的数组(n,m,o),最好是使用原生的numpy工具)。

2 个答案:

答案 0 :(得分:1)

你是对的,有更好的方法,我认为你正在获得numpy的精神。 在您的情况下,解决方案是您必须向B添加一个新维度,该维度包含该维度中的一个条目: 因此,如果你的A形状(n,m,o)你的B必须是形状(n,m,1)然后你可以使用原生广播来完成你的操作“A / B”。 您可以通过向B添加“newaxis”来添加该维度。

import numpy as np
A = np.ones(10,5,3)
B = np.ones(10,5)
Result = A/B[:,:,np.newaxis]

B [:,:,np.newaxis] - >这将把B变成一个形状为(10,5,1)

的数组

答案 1 :(得分:0)

here开始,广播规则是:

  

在两个阵列上操作时,NumPy会比较它们的形状   逐元素。它从尾随尺寸开始,并起作用   前进的方向。

时兼容两个维度
they are equal, or
one of them is 1

您的尺寸为n,m,o和n,m因此不兼容。

如果使用以下内容,/ division运算符将使用广播:

  1. o,n,m除以n,m
  2. n,m,o除以n,m,1