numpy 将两个大小不同的布尔矩阵相加

yzxexxkh  于 2023-04-12  发布在  其他
关注(0)|答案(3)|浏览(188)

我目前正在做一个计算机图形学的入门项目。对于我的实现的特定部分,我正在使用一个布尔NumPy矩阵,其中所有值都是False,一些行/列是True。假设我有两个不同大小的布尔矩阵(对于上下文-这是因为在运行时删除了一些行/列):

[[True, False, False]
[True, False, False]
[True, False, False]]

[[True, True]
[False, False]
[False, False]]

我想创建一个新的矩阵,它将是:

[[True, True, True]
[True, False, False]
[True, False, False]]

=〉意味着我希望接收一个矩阵,该矩阵包含行和列矩阵的所有真值。
如何做到这一点?谢谢

fsi0uk1n

fsi0uk1n1#

如果我理解正确,你可以用途:

a1 = np.array([[True, False, False],
               [True, False, False],
               [True, False, False]])

a2 = np.array([[True, True],
               [False, False],
               [False, False],])

arrays = [a1, a2]

# compute maximum shape
shape = np.maximum.reduce([a.shape for a in arrays])

# pad and count the number of True
n = np.hstack([np.pad(a, list(zip(np.zeros(a.ndim, dtype=int), shape-a.shape)))
               for a in arrays]).sum(axis=1)

# create output using broadcasting
out = np.arange(shape[1])<n[:,None]
  • 注意,这可以用于任意数量的数组。输出中的最大列数是输出中的最大列数,但如果需要,您可以使用out = np.arange(max(shape[1], n.max()))<n[:,None]将其更改为True的数量。*

输出:

array([[ True,  True,  True],
       [ True, False, False],
       [ True, False, False]])
其他示例

输入:

a1 = np.array([[True, False, False],
               [True, False, False]])

a2 = np.array([[True, True],
               [False, False],
               [False, False]])

输出:

array([[ True,  True,  True],
       [ True, False, False],
       [False, False, False]])
d6kp6zgx

d6kp6zgx2#

只要两个矩阵的左上角对齐,就很简单:

记住,你不是在 * 加 *,你是在 * 或 *-环。只要使用logical_or。这是通过元素级的。

  • 根据两个矩阵中较大的一个,确定每个维度的输出矩阵大小
  • 创建一个这样大小的输出矩阵
  • 把一个输入矩阵放进去。
  • OR另一个矩阵。
import numpy as np

A = np.array([[True, False, False],
              [True, False, False],
              [True, False, False]])

B = np.array([[True, True],
              [False, False],
              [False, False]])

n_rows = max(A.shape[0], B.shape[0])
n_cols = max(A.shape[1], B.shape[1])

C = np.zeros((n_rows, n_cols), dtype=bool)

C[:A.shape[0], :A.shape[1]] = A
C[:B.shape[0], :B.shape[1]] = np.logical_or(C[:B.shape[0], :B.shape[1]], B)

print(C)
mepcadol

mepcadol3#

你不能通过编程来添加不同大小的矩阵,你可以设计一个系统来改变布尔值 通过处理单个向量(行或列)的索引,但函数必须通过排除不希望更改的值来构建。本质上,它是一种以特定而非通用方式工作的算法,因此具体功能取决于您希望函数如何基于特定情况工作

相关问题