Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用矩阵对numpy数组的每一行进行多重处理_Python_Numpy - Fatal编程技术网

Python 使用矩阵对numpy数组的每一行进行多重处理

Python 使用矩阵对numpy数组的每一行进行多重处理,python,numpy,Python,Numpy,将np数组的每一行(轴=2)与矩阵相乘的最简单的方法是什么。例如,我正在处理读取为np形状数组(480,512,3)的图像,我想用一个3x3矩阵乘以每个img[I,j]。我不想为此使用for循环。这是我尝试过的,但它给出了一个错误 A = np.array([ [.412453, .35758, .180423], [.212671, .71516, .072169], [.019334, .119193, .950227] ]) lin_

将np数组的每一行(轴=2)与矩阵相乘的最简单的方法是什么。例如,我正在处理读取为np形状数组(480,512,3)的图像,我想用一个3x3矩阵乘以每个img[I,j]。我不想为此使用for循环。这是我尝试过的,但它给出了一个错误

A = np.array([
        [.412453, .35758, .180423],
        [.212671, .71516, .072169],
        [.019334, .119193, .950227]
    ])
lin_XYZ = lambda x: np.dot(A, x[::-1])
#lin_XYZ = np.vectorize(lin_XYZ)
tmp_img = lin_XYZ(tmp_img[:,:])

File ".\proj1a.py", line 24, in color2luv
tmp_img = lin_XYZ(tmp_img[:,:])
File ".\proj1a.py", line 22, in <lambda>
lin_XYZ = lambda x: np.dot(A, x)
A=np.array([
[.412453, .35758, .180423],
[.212671, .71516, .072169],
[.019334, .119193, .950227]
])
lin_XYZ=lambda x:np.dot(A,x[:-1])
#lin_XYZ=np.矢量化(lin_XYZ)
tmp_img=lin_XYZ(tmp_img[:,:])
文件“\proj1a.py”,第24行,彩色2luv
tmp_img=lin_XYZ(tmp_img[:,:])
文件“\proj1a.py”,第22行,在
lin_XYZ=lambda x:np.dot(A,x)
ValueError:形状(3,3)和(480512,3)未对齐:3(尺寸1)!=512(尺寸1)

所以
A
是(3,3)和
x
是(480512,3),你知道什么是三维尺寸上的
dot
。点(A,B)要记住的关键是,A的最后一个dim是B的第二个到最后一个。(这就是错误所抱怨的
3(dim 1)!=512(dim 1)

将满足这一要求

A.dot(x.transpose(0,2,1))   #  (3,3) with (480,3,512) 
也可以工作,尽管生成的数组可能需要进一步转置-假设您希望3是最后一个

您还可以将维度与
einsum
tensordot
配对:

np.einsum('ij,kli->klj', A, x)


x[:-1]
在其第一个维度上翻转
x
,即480维度。形状保持不变。你想要转置吗?

按“行”的意思,你实际上是指轴=2还是轴=1?(因为第一个轴,列轴,是轴=0?)看起来你想要的只是
x.dot(A)
而不是
A.dot(x)
。你可以重塑你的矩阵,比如说,从MxNx3到Ox3,O=M*N,然后乘以它,然后再重塑它。@AGNGazer,请参考:@AGNGazer抱歉,我下次会尝试改进,但我不是想用(480512)乘以3x3,我的意思是每个
img[I,j]
将给出一个包含3个元素的行,然后用
3x3
矩阵相乘,下次@heltonbiker我会尝试更好地描述这个问题,谢谢。我使用opencv读取图像,在(480512,3)中,3表示色带-R、G、B,但opencv将其读取为BGR,我需要它读取为RGB,因此我认为使用
x[:-1]
可以做到这一点。如果需要交换色带,则
:-1
是正确的。
np.einsum('ij,kli->klj', A, x)