Py学习  »  Python

在两个ndarray之间执行广播二进制操作的Pythonic方法

mathguy • 4 年前 • 780 次点击  

标题怎么说。我正在尝试执行以下任务:

1)在两个二维numpy数组之间执行二进制操作(如+、-、*、/、>、<), A1 , A2 , 哪里 A1.shape = (N1, N2_1) , A2.shape = (N1, N2_2) 生成形状为 (N, N2_1, N2_2)

2)在两个三维numpy数组之间执行二进制操作(如+、-、*、/、>、<), A1号 , A2型 , 哪里 A1.shape = (N1, N2, N3_1) , A2.shape = (N1, N2, N3_2) 生成其形状为 (N, N2, N3_1, N3_2)

我发现自己写了很多不符合语法的代码来完成第一个任务 1) . 如果有人能给我展示正确的pythonic代码示例来完成它,我将不胜感激。


我的尝试:

数据来源:

import numpy as np
n_row = 10000
n_col_a1 = 3
n_col_a2 = 4

a1 = np.tile(np.arange(n_col_a1), (n_row, 1))
a2 = np.tile(np.arange(n_col_a2), (n_row, 1))

我不通俗的广播尝试:

X1 = np.broadcast_to(a1, (n_col_a2, *a1.shape))
X1 = np.moveaxis(X1, 0, -1)

X2 = np.broadcast_to(a2, (n_col_a1, *a2.shape))
X2 = np.moveaxis(X2, 0, -2)

result_a1_minus_a2 = X1 - X2
print(result_a1_minus_a2)
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/49491
 
780 次点击  
文章 [ 1 ]  |  最新文章 4 年前
hpaulj
Reply   •   1 楼
hpaulj    4 年前

两个输入数组必须扩展为:

(N1, N2_1)     => (N1, N2_1, 1)
(N1, N2_2)     => (N1, 1,    N2_2)
(N1, N2_1, N2_2)

例如

A1[:, :, None] * A2[:, None, :]

同样地:

(N1, N2, N3_1)
(N1, N2, N3_2)
(N1, N2, N3_1, N3_2)

A1[...,None] * A2[:,:,None,:]