Python 无循环的Numpy矩阵和

Python 无循环的Numpy矩阵和,python,numpy,Python,Numpy,尝试构建无双for循环的numpy矩阵 如果我有一个矩阵: x = [val, val, val] [val, val, val] [val, val, val] 我想用另外两行减去每行的项,同时外推到一个更大的矩阵,得到最终结果。每行减法(在本例中)是3个元素。(不过我用的是更大的矩阵) 然后类似,但与列相反,除了项目是水平填充的,如果有意义的话(每个项目都是一个单独的值) 如果有人有魔法来解决这个问题,我会失去它的 编辑:小矩阵的更好示例: x = [[.5, 0.],

尝试构建无双for循环的numpy矩阵

如果我有一个矩阵:

x = [val, val, val]
    [val, val, val]
    [val, val, val]
我想用另外两行减去每行的项,同时外推到一个更大的矩阵,得到最终结果。每行减法(在本例中)是3个元素。(不过我用的是更大的矩阵)

然后类似,但与列相反,除了项目是水平填充的,如果有意义的话(每个项目都是一个单独的值)

如果有人有魔法来解决这个问题,我会失去它的

编辑:小矩阵的更好示例:

x = [[.5, 0.], 
     [.1, 1.2]]
变成

new = [[ 0.4, -1.2,  0.,   0. ],
       [ 0.,   0.,  -0.4,  1.2]]
new = [[-0.7,  0.,   0.5,  0. ],
       [ 0.,   0.7,  0.,  -0.5]]
和列版本

y = [[.2, .9], 
     [.6, .1]]
变成

new = [[ 0.4, -1.2,  0.,   0. ],
       [ 0.,   0.,  -0.4,  1.2]]
new = [[-0.7,  0.,   0.5,  0. ],
       [ 0.,   0.7,  0.,  -0.5]]

以下是一些索引疯狂,我相信它符合您的要求:

>>> def magic(data):
...     n, m = data.shape
...     assert n==m
...     rows = np.zeros((n, n-1, n, n), data.dtype)
...     cols = np.zeros((n, n-1, n, n), data.dtype)
...     idx = np.argsort(np.identity(n), kind='mergesort', axis=1)
...     self = idx[:, -1] # should be just 0, 1, 2, 3, ...
...     other = idx[:, :-1]
...     rows[self, :, self, :] = data[:, None, :] - data[other[..., None], self]
...     cols[self, ..., self] = data.T[:, None, :] - data.T[other[..., None], self] 
...     return rows.reshape(-1, n*n), cols.reshape(-1, n*n)
... 
>>> magic(np.array([[.5,0], [.1,1.2]]))
(array([[ 0.4, -1.2,  0. ,  0. ],
       [ 0. ,  0. , -0.4,  1.2]]), array([[ 0.5,  0. , -1.1,  0. ],
       [ 0. , -0.5,  0. ,  1.1]]))
>>> magic(np.array([[.2,.9], [.6,.1]]))
(array([[-0.4,  0.8,  0. ,  0. ],
       [ 0. ,  0. ,  0.4, -0.8]]), array([[-0.7,  0. ,  0.5,  0. ],
       [ 0. ,  0.7,  0. , -0.5]]))

你能给出一个有意义的实际例子吗?有实际的数字,所以很清楚发生了什么?我不确定我是否理解你编造的符号。确定我将使用4 x 4矩阵符号。一切都可以。希望这能有所帮助,我看不到任何循环的方法,但计算时间太长了,如果numpy能做点什么就太好了。我从你的描述中猜到了这一点。你们能把它贴在这里吗?第一部分肯定有效,试着调试第二部分的错误。虽然这是一份很棒的工作,但我真的不确定这是否可能。“self”的使用一开始让我很反感,因为它是一个python关键字。@MarkII你能详细说明一下是怎么回事吗?在我看来,它给出了两个测试用例中的预期结果。还有,很抱歉,我太迂腐了-
self
不是一个关键词,它只是按照惯例使用的。别担心,我是个白痴。我用转置版本覆盖了我的测试矩阵。就像我说的,很晚了。这绝对是正确的答案。@MarkII别担心,我自己有时也有点头脑混乱。这也是难以置信的,我肯定需要用numpy变得更好。我99%肯定没有机会。迫不及待地要实现并看到计算时间的变化。