我有多个numpy数组,我想创建新的数组来执行类似XOR的操作……但不完全相同。
我的输入是两个数组,array1和array2。 我的输出是array1的修改后的版本(或新阵列,我并不在乎)。
通过执行以下操作,该修改是逐元素的:
1。)如果给定索引的任何一个数组都为0,则索引保持不变。 2.)如果array1和array2不为零,则为修改后的数组分配array1的索引值减去array2的索引,最小为零。
示例:
array1: [0, 3, 8, 0]
array2: [1, 1, 1, 1]
output: [0, 2, 7, 0]
array1: [1, 1, 1, 1]
array2: [0, 3, 8, 0]
output: [1, 0, 0, 1]
array1: [10, 10, 10, 10]
array2: [8, 12, 8, 12]
output: [2, 0, 2, 0]
我希望能够通过一个numpy.copyto语句来做到这一点,但是我不知道如何做到。谢谢。
编辑:
它只是打我。我可以这样做:
new_array = np.zeros(size_of_array1)
numpy.copyto(new_array, array1-array2, where=array1>array2)
编辑2:由于我很快收到了几个答案,因此我将对不同的答案进行计时,以了解它们的作用。几分钟后返回结果。
好的,结果在:
随机整数0到5的数组,大小= 10,000,10个循环
1。)使用我的np.copyto方法
2。)使用剪辑
3。)使用最大值
0.000768184661865
0.000391960144043
0.000403165817261
Kasramvd在下面还提供了一些有用的时间安排
答案 0 :(得分:4)
In [73]: np.maximum(0,np.array([0,3,8,0])-np.array([1,1,1,1]))
Out[73]: array([0, 2, 7, 0])
这没有明确解决
如果任一数组的给定索引都为0,则索引保持不变。
但结果与所有示例均匹配:
In [74]: np.maximum(0,np.array([1,1,1,1])-np.array([0,3,8,0]))
Out[74]: array([1, 0, 0, 1])
In [75]: np.maximum(0,np.array([10,10,10,10])-np.array([8,12,8,12]))
Out[75]: array([2, 0, 2, 0])
答案 1 :(得分:4)
您可以使用简单的减法并将结果剪裁为min
的零:
(arr1 - arr2).clip(min=0)
演示:
In [43]: arr1 = np.array([0,3,8,0]); arr2 = np.array([1,1,1,1])
In [44]: (arr1 - arr2).clip(min=0)
Out[44]: array([0, 2, 7, 0])
在大型数组上,它比maximum
方法还快:
In [51]: arr1 = np.arange(10000); arr2 = np.arange(10000)
In [52]: %timeit np.maximum(0, arr1 - arr2)
22.3 µs ± 1.77 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [53]: %timeit (arr1 - arr2).clip(min=0)
20.9 µs ± 167 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [54]: arr1 = np.arange(100000); arr2 = np.arange(100000)
In [55]: %timeit np.maximum(0, arr1 - arr2)
671 µs ± 5.69 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [56]: %timeit (arr1 - arr2).clip(min=0)
648 µs ± 4.43 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
请注意,如果arr2
可能具有负值,则应考虑在abs
上使用arr2
函数以获得预期结果:
(arr1 - abs(arr2)).clip(min=0)
答案 2 :(得分:0)
您可以首先简单地将数组相减,然后对相减后的结果使用boolean array indexing
将0赋给负值,如:
# subtract
In [43]: subtracted = arr1 - arr2
# get a boolean mask by checking for < 0
# index into the array and assign 0
In [44]: subtracted[subtracted < 0] = 0
In [45]: subtracted
Out[45]: array([0, 2, 7, 0])
对OP指定的其他输入应用相同的操作:
In [46]: arr1 = np.array([1, 1, 1, 1])
...: arr2 = np.array([0, 3, 8, 0])
In [47]: subtracted = arr1 - arr2
In [48]: subtracted[subtracted < 0] = 0
In [49]: subtracted
Out[49]: array([1, 0, 0, 1])
对于第三个输入数组:
In [50]: arr1 = np.array([10, 10, 10, 10])
...: arr2 = np.array([8, 12, 8, 12])
In [51]: subtracted = arr1 - arr2
In [52]: subtracted[subtracted < 0] = 0
In [53]: subtracted
Out[53]: array([2, 0, 2, 0])