我有一个问题,理解为什么以下不起作用:
我有一个可以是三维或六维的阵列前因子.我有一个有四个维度的阵列偶极子.前三个维度偶极场比赛的最后三个维度前因子.
由于我不知道前因子的形状,我使用省略号来说明前因子中的三个可选维度:
numpy.einsum('...lmn,lmno->...o', prefactor, dipoles)
Run Code Online (Sandbox Code Playgroud)
(在这里的示例中,prefactor.shape是(1,1,1,160,160,128),dipoles.shape是(160,160,128,3).执行时,我得到错误:
操作数1没有足够的尺寸来匹配广播,并且无法扩展,因为在开头和结尾都指定了爱因斯坦和下标
但是,当我向第二个术语添加省略号时,它确实有效:
numpy.einsum('...lmn,...lmno->...o', prefactor, dipoles)
Run Code Online (Sandbox Code Playgroud)
只是我不明白为什么,因为那里不应该有省略号.有人知道这里发生了什么吗?
在http://comments.gmane.org/gmane.comp.python.numeric.general/53705上也提出了同样的问题,但还没有令人满意的答案.
给定两个数组A(shape:MXC)和B(shape:NXC),有没有一种方法可以A在B不使用循环的情况下从每一行中减去每一行?最终输出将是形状(MNXC)。
A = np.array([[ 1, 2, 3],
[100, 200, 300]])
B = np.array([[ 10, 20, 30],
[1000, 2000, 3000],
[ -10, -20, -2]])
Run Code Online (Sandbox Code Playgroud)
所需结果(可以具有其他形状)(已编辑):
array([[ -9, -18, -27],
[-999, -1998, -2997],
[ 11, 22, 5],
[ 90, 180, 270],
[-900, -1800, -2700],
[ 110, 220, 302]])
Shape: 6 X 3
Run Code Online (Sandbox Code Playgroud)
(循环太慢,“外部”减去每个元素而不是每一行)
torch.add(torch.ones(4,1), torch.randn(4))
Run Code Online (Sandbox Code Playgroud)
产生尺寸为Tensor : torch.Size([4,4]).
有人可以提供这背后的逻辑吗?
我有一个NumPy ndarray形状(32,1024 )并保持32个信号测量我想组合成一个1024元素的长阵列,32个中的每个都有不同的权重.我正在使用numpy.average但我的权重很复杂,average根据抛出结果的总和执行权重的标准化.
看一下平均代码,我意识到我可以通过将权重乘以信号数组然后在第一个轴上求和来完成同样的事情.然而,当我尝试将我的(32,)权重数组乘以(32,1024)信号数组时,我得到一个维度不匹配,因为(32,)不能广播到(32,1024).如果我将权重数组重塑为(32,1),那么一切都按预期工作,但这会导致相当丑陋的代码:
avg = (weights.reshape((32, 1)) * data).sum(axis=0)
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释为什么NumPy不允许我的(32,)阵列广播到(32,1024)和/或建议一种替代的,更简洁的方式来执行加权平均值?
我正在尝试创建一个三维数组,Tusing numpy定义如下:
T_ {i,j,k} =\delta_ {i,k} - \delta {j,k}
其中\ delta_ {i,j}是Kronecker delta函数(当i = j时为1,否则为0).我想知道使用numpy最有效的方法是什么.我可以使用for循环创建两个三维数组并减去它们.但我怀疑有一种更快速,更惯用的方法.非常感激任何的帮助.
给定两个矩阵,我想计算所有行之间的成对差异.每个矩阵有1000行和100列,所以它们相当大.我尝试使用for循环和纯广播,但for循环似乎工作得更快.难道我做错了什么?这是代码:
from numpy import *
A = random.randn(1000,100)
B = random.randn(1000,100)
start = time.time()
for a in A:
sum((a - B)**2,1)
print time.time() - start
# pure broadcasting
start = time.time()
((A[:,newaxis,:] - B)**2).sum(-1)
print time.time() - start
Run Code Online (Sandbox Code Playgroud)
广播方法需要大约1秒的时间,对于大型矩阵来说甚至更长.任何想法如何加速纯粹使用numpy?
我在理解numpy dot函数和广播背后的工作时遇到了问题.Below是我试图理解的片段
a=np.array([[1,2],[3,5]])
如果我们检查的形状
a.shape
将是(2,2)
b=np.array([3,6])
和 b.shape is (2,)
问题1:是b列向量还是行向量?虽然提供输入似乎b是行向量,但然后形状显示为具有2行的列向量.我的理解中的错误是什么?
现在,如果
a.dot(b)
它导致
array([15,39])
问题2:按矩阵乘法如果a是m*n则b必须n*k并且由于a是2×2然后b必须是2*1.这是否验证是否b为列向量,否则如果它是行向量则矩阵乘法不可能,但点积的输出确实根据矩阵乘法给出值b作为列向量并广播它
现在b.dot(a)也是可能的,并且导致了
array([21,36])这一点,这引起了我的注意.他们如何检查向量的矩阵乘法的兼容性以及它们如何计算?在至少一个场景中,它们必须抛出不兼容维度的错误以进行乘法.但是它没有显示,并且它们在两种情况下都计算结果.
我正在尝试对60000x100矩阵的外积进行归一化求和.我想用numpy方式来做,因为我的解决方案受到列表解析中的python for循环的约束:
def covariance_over_time(X):
B = np.sum(np.array([np.outer(x, x) for x in X]),axis=0)
B = np.true_divide(B, len(X))
return B
Run Code Online (Sandbox Code Playgroud)
请注意,即使这个解决方案有效,它也是单线程的,因此当X有60000行和100列时非常慢.
我尝试过其他方法,例如stackoverflow上的描述.链接中发布的答案适用于小矩阵,在几秒钟后出现错误.你知道为什么吗?(注意:我有6个TeraByte的RAM,因此我不太可能遇到内存问题,因为我根本没有看到内存使用量增长!)
我有多个0和1的矩阵,我想找到NOT的版本.例如:
M
0 1 0
1 0 1
0 1 0
Run Code Online (Sandbox Code Playgroud)
会成为:
!M
1 0 1
0 1 0
1 0 1
Run Code Online (Sandbox Code Playgroud)
现在我有了
for row in image:
map(lambda x: 1 if x == 0 else 0, row)
Run Code Online (Sandbox Code Playgroud)
哪个效果很好,但我有一种感觉,我已经看到这完成了简单的广播.不幸的是,我没有看到任何东西已经敲响了钟声.我假设类似的操作将用于阈值矩阵的值(即类似的东西1 if x > .5 else 0).
我有2个2D阵列,1个相同维度的轴:
a = np.array(np.arange(6).reshape((2,3)))
b = np.array(np.arange(12).reshape((3,4)))
Run Code Online (Sandbox Code Playgroud)
我想繁殖和广播的每一行a有b,那就是
b_r = np.repeat(b[:,:,None], 2, axis=2)
ab = a.T[:,None,:] * b_r
Run Code Online (Sandbox Code Playgroud)
可以在避免播放的同时进行广播repeat吗?我们的想法是避免为repeat操作分配不必要的内存.
所以这是交易:我有一个变量x,它是一个numpy.ndarray。此结构的大小为1000。如果我这样做x[0],则得到numpy.void4个数字的。如果我这样做x[1],那么我会得到另一个numpy.void,也有4个数字,依此类推。
我只想做的是:我想对这个数据结构进行切片,以便提取大小为1000x3的numpy矩阵。
我怎么做?谢谢
我想将测试应用于pandas数据帧,并根据测试结果在相应的数据帧中创建标记.我到目前为止:
import numpy as np
import pandas as pd
matrix = pd.DataFrame({'a': [1, 11, 2, 3, 4], 'b': [5, 6, 22, 8, 9]})
flags = pd.DataFrame(np.zeros(matrix.shape), columns=matrix.columns)
flag_values = pd.Series({"a": 100, "b": 200})
flags[matrix > 10] = flag_values
Run Code Online (Sandbox Code Playgroud)
但这会引发错误
ValueError: Must specify axis=0 or 1
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我在哪里可以指定轴?有没有更好的方法来实现这一目标?
编辑:
我在这个例子中寻找"标志"的结果是
a b
0 0
100 0
0 200
0 0
0 0
Run Code Online (Sandbox Code Playgroud) a=np.arange(240).reshape(3,4,20)
b=np.arange(12).reshape(3,4)
c=np.zeros((3,4),dtype=int)
x=np.arange(3)
y=np.arange(4)
Run Code Online (Sandbox Code Playgroud)
我想通过以下没有循环的步骤获得2d(3,4)形状数组。
for i in x:
c[i]=a[i,y,b[i]]
c
array([[ 0, 21, 42, 63],
[ 84, 105, 126, 147],
[168, 189, 210, 231]])
Run Code Online (Sandbox Code Playgroud)
我试过了,
c=a[x,y,b]
Run Code Online (Sandbox Code Playgroud)
但它显示
IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (3,) (4,) (3,4)
然后我还试图建立newaxis的[:,None],它也不起作用。