如何通过创建单独的二进制数组来高效地分割NumPy数组

2024-09-22 10:14:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在以NumPy数组形式存储的图像中分离不同的对象。例如,如果我有2D NumPy数组:

X = np.array([[1.4E14, 1.4E14, 1.6E14], [1.4E14, 1.6E14, 1.6E14], [1.6E14, 1.1E14, 1.1E14]])

如何通过实例将其拆分为相同形状的二进制数组,如下所示:

Y = np.array([[1, 1, 0], [1, 0, 0], [0, 0, 0]])
Z = np.array([[0, 0, 1], [0, 1, 1], [1, 0, 0]])
W = np.array([[0, 0, 0], [0, 0, 0], [0, 1, 1]])

其中Y表示1.4E14的值,Z表示1.6E14的值,W表示1.1E14的值,所有实例的形状与原始数组相同。对于如何在大数组中有效地执行此操作,有什么想法吗?你知道吗


Tags: 对象实例图像numpynp二进制数组array
3条回答

您可以使用NumPy的^{}函数在X中查找唯一的值,^{}X元素与这些值进行比较,^{}方法将结果转换为整数:

In [76]: import numpy as np

In [77]: X = np.array([[1.4E14, 1.4E14, 1.6E14], 
    ...:               [1.4E14, 1.6E14, 1.6E14], 
    ...:               [1.6E14, 1.1E14, 1.1E14]])
    ...: 

In [78]: for value in np.unique(X):
    ...:     binary_array = np.equal(X, value).astype(int)
    ...:     print(f'{value:.1E}\n{binary_array}\n')
    ...: 
    ...: 
1.1E+14
[[0 0 0]
 [0 0 0]
 [0 1 1]]

1.4E+14
[[1 1 0]
 [1 0 0]
 [0 0 0]]

1.6E+14
[[0 0 1]
 [0 1 1]
 [1 0 0]]

在上面的代码中binary_array = np.int_(X == value)也可以工作。你知道吗

这样就可以了:

import numpy as np

X = ([1.4E14, 1.4E14, 1.6E14], [1.4E14, 1.6E14, 1.6E14], [1.6E14, 1.1E14, 1.1E14])

numbers = [1.4E14, 1.6E14, 1.1E14]

x = np.array(X)

for j in numbers:
    result = (x == j)+0
    print("comparing with " + str(j))
    print(result[:].tolist())
    print("")

你想要np.where

values = {1.4E14, 1.6E14, 1.1E14}

lst = []
for k, v in values.items():
    lst.append(np.where(X == val, 1, 0))

唯一的班轮 {k: (X == v).astype(np.int) for k, v in {'Y': 14, 'Z': 16, 'W': 11}.items()}

{
'Y': array([[1, 1, 0], [1, 0, 0], [0, 0, 0]]), 
'Z': array([[0, 0, 1], [0, 1, 1], [1, 0, 0]]), 
'W': array([[0, 0, 0], [0, 0, 0], [0, 1, 1]])
}

相关问题 更多 >