Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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中,将除一行/列之外的整个矩阵相乘_Python_Arrays_Pandas_Numpy - Fatal编程技术网

在python中,将除一行/列之外的整个矩阵相乘

在python中,将除一行/列之外的整个矩阵相乘,python,arrays,pandas,numpy,Python,Arrays,Pandas,Numpy,Python脚本编写:我想用标量乘以除一行/列之外的整个矩阵。行/列编号是一个变量 比如说, [[2 2 2 2 2] [2 2 2 2 2]] num=2 标量=3 我希望结果是这样的 [[6 6 2 6 6] [6 6 2 6 6]] 我不想要任何循环。我可以用numpy或者熊猫。实现这一目标的最佳方法是什么?这里有一种方法: A = np.full((2, 5), 2) num = 2 scalar = 3 A[:, np.delete(np.arange(A.shape[1]),

Python脚本编写:我想用标量乘以除一行/列之外的整个矩阵。行/列编号是一个变量

比如说,

[[2 2 2 2 2]
[2 2 2 2 2]]
num=2

标量=3

我希望结果是这样的

[[6 6 2 6 6]
[6 6 2 6 6]]
我不想要任何循环。我可以用numpy或者熊猫。实现这一目标的最佳方法是什么?

这里有一种方法:

A = np.full((2, 5), 2)
num = 2
scalar = 3

A[:, np.delete(np.arange(A.shape[1]), num)] *= scalar

array([[6, 6, 2, 6, 6],
       [6, 6, 2, 6, 6]])
还有一种方法

a = np.array([[2, 2, 2, 2, 2], [2, 2, 2, 2, 2]])
num = 2
scalar = 3
b = tuple({i for i in range(a.shape[1]) if i != num})
a[:, b] *= scalar
编辑: 我刚刚注意到您不需要任何循环,而b是用一个循环初始化的

In [52]: num, scalar = 2,3
制作列乘数的一种方法:

In [53]: mul = np.ones(5,int)*scalar
In [54]: mul[num] = 1

In [55]: arr = np.ones((2,5),int)*2
In [56]: arr
Out[56]: 
array([[2, 2, 2, 2, 2],
       [2, 2, 2, 2, 2]])

In [57]: mul
Out[57]: array([3, 3, 1, 3, 3])

In [58]: arr * mul            # (2,5) * (5,)
Out[58]: 
array([[6, 6, 2, 6, 6],
       [6, 6, 2, 6, 6]])

在连续块上操作非常快。因此,最快的解决方案可能是:

temp = A[:, k].copy()
A *= x
A[:, k] = temp
一些时间安排。上述方法是
i_pp_1
f_pp_1
同样不合适。就地和异地解决方案分别列出。对于显式复制,会更正就地计时。下面的行
copy
也针对copy进行了更正,即应为零直到噪声:

size: (2, 5)
inplace
copy           -0.0 us
i_pp_1          2.5 us
i_pp_2          6.3 us
i_hpaulj        3.7 us
i_jpp          17.0 us
new out
f_pp_1          1.4 us
f_hpaulj        3.6 us
size: (20, 50)
inplace
copy           -0.0 us
i_pp_1          3.3 us
i_pp_2          9.0 us
i_hpaulj        5.1 us
i_jpp          21.0 us
new out
f_pp_1          2.1 us
f_hpaulj        5.1 us
size: (200, 500)
inplace
copy           -0.1 us
i_pp_1         57.0 us
i_pp_2        207.7 us
i_hpaulj      103.2 us
i_jpp         773.8 us
new out
f_pp_1         67.6 us
f_hpaulj      116.8 us
代码:


使用
参数,并且可以复制或就地执行(基于上面@PaulPanzer的
i_pp_1()
):

测试:

a = np.full((2,5), 2)
exclusive_mult(a, 2, 3, 1)
a
Out:
array([[6, 6, 2, 6, 6],
       [6, 6, 2, 6, 6]])

a = np.full((2,5), 2)
exclusive_mult(a, 2, 3, 1, False)
Out:
array([[6, 6, 2, 6, 6],
       [6, 6, 2, 6, 6]])
a 
Out: 
array([[2, 2, 2, 2, 2],
       [2, 2, 2, 2, 2]])

一个重要的提示:这个问题询问行或列的可能性。对于行,乘数需要(2,1)成形-由广播规则。实际上,这不应该起作用。您必须明确地强制为
保留
创建一个副本,否则它将不会保留原始值。@PaulPanzer同意。抱歉,在未选中>的情况下根据您的答案重构了它。
def exclusive_mult(a, num, scalar, axis = 0, inplace = True):
    if not inplace:
        a = a.copy()
    s = tuple(slice(None, None, None) if i != axis else num for i in range(a.ndim))
    keep = a[s].copy()
    a *= scalar
    a[s] = keep
    if not inplace:
        return a
a = np.full((2,5), 2)
exclusive_mult(a, 2, 3, 1)
a
Out:
array([[6, 6, 2, 6, 6],
       [6, 6, 2, 6, 6]])

a = np.full((2,5), 2)
exclusive_mult(a, 2, 3, 1, False)
Out:
array([[6, 6, 2, 6, 6],
       [6, 6, 2, 6, 6]])
a 
Out: 
array([[2, 2, 2, 2, 2],
       [2, 2, 2, 2, 2]])