我有一个2D numpy数组,其形状为(3,3),dtype = object,其元素是形式的元组(str,str,float)。
template = ('Apple', 'Orange', 5.0)
my_array = np.array([None] * 9).reshape((3,3))
for i in range(my_array.shape[0]):
for j in range(my_array.shape[1]):
my_array[i, j] = template
但是当我试图获得一个布尔掩码时
print(my_array == template)
答案都是假的
[[False False False]
[False False False]
[False False False]]
然而,元素比较仍然有效
print(my_array[0,0] == template) # This prints True
为什么布尔掩码返回所有False以及如何使其工作?
P.S。我搜索了相关主题,但无法使用任何...
Array of tuples in Python
Restructuring Array of Tuples
Apply function to an array of tuples
Filter numpy array of tuples
答案 0 :(得分:0)
这里发生的事情是Python tuples are compared by position. 所以当你这样做时
my_array == template
你实际在做什么(逐行):
('Apple', 'Orange', 5.0) == 'Apple'
('Apple', 'Orange', 5.0) == 'Orange'
('Apple', 'Orange', 5.0) == 5.0
要验证是否是这种情况,请尝试尝试以下示例:
>>> other_array = np.array(['Apple', 'Orange', 5.0] * 3).reshape(3,3)
>>> other_array
array([['Apple', 'Orange', '5.0'],
['Apple', 'Orange', '5.0'],
['Apple', 'Orange', '5.0']], dtype='<U6')
>>> other_array == template
array([[ True, True, True],
[ True, True, True],
[ True, True, True]])
我不知道有任何非黑客的解决方法,并且可以直接进行平等比较。如果黑客足够并且您的阵列不是太大,您可以尝试:
mask = np.array(list(map(lambda x: x == template,
my_array.flatten()))).reshape(my_array.shape)
或
mask = np.array([x == template for x in my_array.flatten()]).reshape(my_array.shape)
您是否需要一组元组?你不能在你的数组中有另一个维度,或者可能使用pandas作为分类变量吗?