我想将数组广播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) 我有一个形状(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的情况下不起作用,我得到以下错误: …
我有一个矢量[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循环来做.
今天,我发现代码中有些奇怪的地方,发现在某些情况下它会执行以下命令:
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)
我对此行为有一些疑问:
感谢您的澄清!
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)
没有实际需要对数组求和?如果没有内置函数,那么好的实现会是什么样的?
假设我们想要计算矩阵和列向量的点积:
所以在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)
因此矩阵点矢量数组确实有效(因此它将其视为列向量),但是其他操作(转置)不起作用.这不是真的一致设计不是吗?
例如,尝试理解这些结果:
>>> 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) 我有一个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的新手,我需要实现一个聚类算法.为此,我需要计算给定输入数据之间的距离.
考虑以下输入数据 -
[[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
我尝试使用列表为数组(具有五个维度)建立索引。但是,在某些情况下,数组会被置换。
假设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)
任何人都可以阐明它吗?