簡體   English   中英

將2D數組中的每列與另一個2D數組中的每列相乘

[英]Multiply each column from 2D array with each column from another 2D array

我有兩個Numpy數組x ,形狀(m, i)y形狀(m, j) (因此行數相同)。 我想將x的每一列與y元素的每一列相乘,以便結果具有形狀(m, i*j)

例:

import numpy as np

np.random.seed(1)
x = np.random.randint(0, 2, (10, 3))
y = np.random.randint(0, 2, (10, 2))

這將創建以下兩個數組x

array([[1, 1, 0],
       [0, 1, 1],
       [1, 1, 1],
       [0, 0, 1],
       [0, 1, 1],
       [0, 0, 1],
       [0, 0, 0],
       [1, 0, 0],
       [1, 0, 0],
       [0, 1, 0]])

y

array([[0, 0],
       [1, 1],
       [1, 1],
       [1, 0],
       [0, 0],
       [1, 1],
       [1, 1],
       [1, 1],
       [0, 1],
       [1, 0]])

現在的結果應該是:

array([[0, 0, 0, 0, 0, 0],
       [0, 0, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1],
       [0, 0, 0, 0, 1, 0],
       [0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 1, 1],
       [0, 0, 0, 0, 0, 0],
       [1, 1, 0, 0, 0, 0],
       [0, 1, 0, 0, 0, 0],
       [0, 0, 1, 0, 0, 0]])

目前,我已經在xy的列上使用兩個嵌套循環實現了此操作:

def _mult(x, y):
    r = []
    for xc in x.T:
        for yc in y.T:
            r.append(xc * yc)
    return np.array(r).T

但是,我很確定必須有一個更優雅的解決方案,我似乎無法想出。

使用NumPy broadcasting -

(y[:,None]*x[...,None]).reshape(x.shape[0],-1)

說明

作為投入,我們有 -

y : 10 x 2
x : 10 x 3

使用y[:,None] ,我們在現有的兩個dims之間引入了一個新軸,從而創建了它的3D數組版本。 這使第一個軸保持為3D版本中的第一個軸,並將第二個軸作為第三個軸推出。

使用x[...,None] ,我們引入一個新軸作為最后一個軸,通過將兩個現有的dims作為前兩個dims推高以產生3D陣列版本。

總而言之,隨着新軸的引入,我們有 -

y : 10 x 1 x 2
x : 10 x 3 x 1

使用y[:,None]*x[...,None]yx都會有broadcasting ,從而產生一個形狀為(10,3,2)的輸出數組。 要獲得形狀(10,6)的最終輸出數組,我們只需要將最后兩個軸與該重塑合並。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM