标签: numpy-broadcasting

是否有更好的广播阵列方式?

我想将数组广播b到它与另一个数组进行算术运算时所需的形状a.

例如,如果a.shape = (3,3)并且b是标量,我想得到一个形状为(3,3)并且用标量填充的数组.

一种方法是这样的:

>>> import numpy as np
>>> a = np.arange(9).reshape((3,3))
>>> b = 1 + a*0
>>> b
array([[1, 1, 1],
       [1, 1, 1],
       [1, 1, 1]])
Run Code Online (Sandbox Code Playgroud)

虽然这实际上很有效,但我不禁觉得它看起来有点奇怪,并且对于那些看着代码的人来说,我试图做的事情并不明显.

有没有更优雅的方式来做到这一点?我查看了文档np.broadcast,但速度要慢一些.

In [1]: a = np.arange(10000).reshape((100,100))

In [2]: %timeit 1 + a*0
10000 loops, best of 3: 31.9 us per loop

In [3]: %timeit bc = np.broadcast(a,1);np.fromiter((v for u, v in bc),float).reshape(bc.shape)
100 loops, best of …
Run Code Online (Sandbox Code Playgroud)

python numpy numpy-broadcasting

6
推荐指数
1
解决办法
739
查看次数

如何将pandas数据帧与numpy数组与广播相乘

我有一个形状(4,3)的数据帧如下:

In [1]: import pandas as pd

In [2]: import numpy as np

In [3]: x = pd.DataFrame(np.random.randn(4, 3), index=np.arange(4))

In [4]: x
Out[4]: 
          0         1         2
0  0.959322  0.099360  1.116337
1 -0.211405 -2.563658 -0.561851
2  0.616312 -1.643927 -0.483673
3  0.235971  0.023823  1.146727
Run Code Online (Sandbox Code Playgroud)

我想将数据帧的每一列与numpy数组形状(4,)相乘:

In [9]: y = np.random.randn(4)

In [10]: y
Out[10]: array([-0.34125522,  1.21567883, -0.12909408,  0.64727577])
Run Code Online (Sandbox Code Playgroud)

在numpy中,以下广播技巧有效:

In [12]: x.values * y[:, None]
Out[12]: 
array([[-0.32737369, -0.03390716, -0.38095588],
       [-0.25700028, -3.11658448, -0.68303043],
       [-0.07956223,  0.21222123,  0.06243928],
       [ 0.15273815,  0.01541983,  0.74224861]])
Run Code Online (Sandbox Code Playgroud)

但是,它在pandas dataframe的情况下不起作用,我得到以下错误: …

python numpy pandas numpy-broadcasting

6
推荐指数
2
解决办法
8582
查看次数

Numpy - 用向量行创建矩阵

我有一个矢量[x,y,z,q],我想创建一个矩阵:

[[x,y,z,q],
 [x,y,z,q],
 [x,y,z,q],
...
 [x,y,z,q]]
Run Code Online (Sandbox Code Playgroud)

有m行.我认为这可以通过一些聪明的方式,使用广播来完成,但我只能想到用for循环来做.

python numpy python-2.7 numpy-broadcasting

6
推荐指数
1
解决办法
1万
查看次数

python list +空的numpy数组=空的numpy数组?

今天,我发现代码中有些奇怪的地方,发现在某些情况下它会执行以下命令:

my_list = [0] + np.array([])
Run Code Online (Sandbox Code Playgroud)

结果my_list如下:

array([], dtype=float64)
Run Code Online (Sandbox Code Playgroud)

一开始我很困惑,比我理解的解释器要先将列表转换为一个numpy数组,然后再尝试广播操作:

>>> np.array([0]) + np.array([])
array([], dtype=float64)
Run Code Online (Sandbox Code Playgroud)

我对此行为有一些疑问:

  • 为什么要广播?
  • python抛出错误会更好吗,至少在这种情况下,列表被转换并消失了?

感谢您的澄清!

python arrays numpy numpy-broadcasting

6
推荐指数
1
解决办法
91
查看次数

Numpy函数可以获得添加数组的形状

tl; dr:我如何预测numpy广播在几个数组中返回的形状而不必实际添加数组?

我有很多脚本使用numpy(Python)广播规则,因此基本上1D输入会产生多维输出.对于一个基本的例子,理想气体定律(压力= rho*R_d*温度)可能看起来像

def rhoIdeal(pressure,temperature):
    rho = np.zeros_like(pressure + temperature)
    rho += pressure / (287.05 * temperature)
    return rho
Run Code Online (Sandbox Code Playgroud)

这里没有必要,但在更复杂的函数中,初始化具有正确形状的数组非常有用.如果压力和温度具有相同的形状,那么rho也具有这种形状.如果压力有形状(n,),温度有形状(m,),我可以打电话

rhoIdeal(pressure[:,np.newaxis], temperature[np.newaxis,:])
Run Code Online (Sandbox Code Playgroud)

获得rho形状(n,m).这使我可以制作具有多个温度值的绘图而无需循环rhoIdeal,同时仍然允许脚本接受相同形状的数组并逐个元素地计算结果.

我的问题是:是否有内置函数返回与多个输入兼容的形状?表现得像的东西

def returnShape(list_of_arrays):
    return np.zeros_like(sum(list_of_arrays)).shape
Run Code Online (Sandbox Code Playgroud)

没有实际需要对数组求和?如果没有内置函数,那么好的实现会是什么样的?

python arrays numpy numpy-broadcasting

5
推荐指数
1
解决办法
392
查看次数

为什么Python/Numpy需要矩形/矢量点积的行向量?

假设我们想要计算矩阵和列向量的点积:

矩阵点矢量

所以在Numpy/Python中我们走了:

a=numpy.asarray([[1,2,3], [4,5,6], [7,8,9]])
b=numpy.asarray([[2],[1],[3]])
a.dot(b)
Run Code Online (Sandbox Code Playgroud)

结果是:

数组([[13],[31],[49]])

到目前为止,这么好,但为什么这也有效?

b=numpy.asarray([2,1,3])
a.dot(b)
Run Code Online (Sandbox Code Playgroud)

结果是:

数组([13,31,49])

我希望[2,1,3]是行向量(需要转置才能应用点积),但Numpy似乎默认将数组视为列向量(在矩阵乘法的情况下)?

这是如何运作的?

编辑:

为什么:

b=numpy.asarray([2,1,3])
b.transpose()==b
Run Code Online (Sandbox Code Playgroud)

因此矩阵点矢量数组确实有效(因此它将其视为列向量),但是其他操作(转置)不起作用.这不是真的一致设计不是吗?

python numpy numpy-broadcasting

5
推荐指数
1
解决办法
1002
查看次数

使用==比较numpy数组的规则是什么?

例如,尝试理解这些结果:

>>> x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> (x == np.array([[1],[2]])).astype(np.float32)
array([[ 0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]], dtype=float32)
>>> (x == np.array([1,2]))
   False
>>> (x == np.array([[1]])).astype(np.float32)
array([[ 0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]], dtype=float32)
>>> (x == np.array([1])).astype(np.float32)
array([ 0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.], dtype=float32)

>>> (x == …
Run Code Online (Sandbox Code Playgroud)

python numpy numpy-broadcasting

5
推荐指数
1
解决办法
4919
查看次数

Numpy:将数组中的每个值替换为其相邻元素的平均值

我有一个ndarray,我想用它的相邻元素的平均值替换数组中的每个值.下面的代码可以完成这项工作,但是当我有700个阵列都具有形状(7000,7000)时,它是超级慢的,所以我想知道是否有更好的方法来做到这一点.谢谢!

a = np.array(([1,2,3,4,5,6,7,8,9],[4,5,6,7,8,9,10,11,12],[3,4,5,6,7,8,9,10,11]))
row,col = a.shape
new_arr = np.ndarray(a.shape)
for x in xrange(row):
    for y in xrange(col):
        min_x = max(0, x-1)
        min_y = max(0, y-1)
        new_arr[x][y] = a[min_x:(x+2),min_y:(y+2)].mean()
print new_arr
Run Code Online (Sandbox Code Playgroud)

python arrays numpy numpy-broadcasting

5
推荐指数
1
解决办法
756
查看次数

计算矩阵中所有其他点之间的距离

我是Python的新手,我需要实现一个聚类算法.为此,我需要计算给定输入数据之间的距离.

考虑以下输入数据 -

    [[1,2,8],
     [7,4,2],
     [9,1,7],
     [0,1,5],
     [6,4,3]]
Run Code Online (Sandbox Code Playgroud)

我想在这里实现的是,我想计算[1,2,8]与所有其他点的距离,并找到距离最小的点.

我必须为所有其他要点重复这一点.

我试图用FOR循环实现它,但我确信SciPy/NumPy必须有一个函数可以帮助我有效地实现这个结果.

我在线查看,但'pdist'命令无法完成我的工作.

有人可以指导我吗?

TIA

python numpy python-2.7 python-3.x numpy-broadcasting

5
推荐指数
2
解决办法
4739
查看次数

使用列表索引的Python数组,但排列尺寸已置换

我尝试使用列表为数组(具有五个维度)建立索引。但是,在某些情况下,数组会被置换。

假设a的形状为(3,4,5,6,7),即

>>> a = np.zeros((3,4,5,6,7))
>>> a.shape
(3, 4, 5, 6, 7)
Run Code Online (Sandbox Code Playgroud)

使用列表在第三维上索引此数组,它看起来很正常:

>>> a[:,:,[0,3],:,:].shape
(3, 4, 2, 6, 7)
Run Code Online (Sandbox Code Playgroud)

但是,如果在以下情况下对数组建立索引,则第三维将排列到最左侧:

>>> a[0,:,[0,1],:,:].shape
(2, 4, 6, 7)
Run Code Online (Sandbox Code Playgroud)

任何人都可以阐明它吗?

python numpy numpy-broadcasting numpy-ndarray

5
推荐指数
1
解决办法
97
查看次数