在下面的示例中,data1,data2和data3是给定的数组。现在,我必须找出所有给定数组中存在的元素。然后,我必须创建仅包含那些公共元素的新数组,并将所有其他元素指定为nan值。
将numpy导入为np
data1 = np.array ([[1,2,33,4,33,6],[7,8,9,10,93,12]])
data2 = np.array ([[1,14,33,15,33,17],[18,19,20,21,93,23]])
data3 = np.array ([[24,25,33,26,1,28],[93,30,31,32,93,34]])
所需的结果如下所示为结果数组:只有值33和93可用于同一位置的所有给定数组(即,它们应重叠)。换句话说,我必须在这里找出每个数组中具有相同值的重叠元素。
result = np.array([[nan,nan,33,nan,nan,nan],[nan,nan,nan,nan,93,nan]])
我期待一种有效的计算方法。任何想法都将受到高度赞赏。
答案 0 :(得分:2)
使用布尔索引
import numpy as np
result = np.empty_like(data1, dtype=float)
# Make an array of True-False values storing which indices are the same
indices = (data1==data2) * (data2==data3)
result[indices] = data1[indices]
result[~indices] = np.nan
如果你有更多的数组,你可以这样做: (假设数组在列表中)
# construct the list of arrays
data = []
for i in xrange(8):
data.append(np.random.randint(0,2, (20, 20)))
indices = data[0] == data[1]
for i in xrange(2, 8):
indices *= (data[0] == data[i])
result = np.empty_like(data[1], dtype=float)
result[indices] = data1[indices]
result[~indices] = np.nan
result
然而,如果每个阵列只是3D阵列的一部分,那将会好得多。
在另一个答案中显示,给定几个数组,您可以从它们创建一个3D数组,然后使用np.where
。
这是一种有效的方法。
我将在这里展示如何使用阵列广播来做到这一点。
在这种情况下,我们可以执行以下操作
# construct 3D array with random data
# each data array will be a slice of this array, e.g. data[0], data[1], etc.
data = np.random.randint(0, 3, (3, 4, 5))
# make an empty array to store the results as before
result = np.empty_like(data[0], dtype=float)
# use broadcasting to test for equality
indices = np.all(data == data[0], axis=0)
# Do the assignment as before
result[indices] = data[0][indices]
result[~indices] = np.nan
result