Nat*_*mas 3 python arrays numpy
我对numpy数组相当新,并且在将一个数组与另一个数组进行比较时遇到了问题.
我有两个数组,这样:
a = np.array([1,2,3,4,5])
b = np.array([2,4,3,5,2])
Run Code Online (Sandbox Code Playgroud)
我想做类似以下的事情:
if b > a:
c = b
else:
c = a
Run Code Online (Sandbox Code Playgroud)
所以我最终得到一个数组c = np.array([2,4,3,5,5]).
否则,这可以被认为是取两个数组的每个元素的最大值.
但是,我遇到了错误
ValueError: The truth value of an array with more than one element is ambiguous.
Use a.any() or a.all().
Run Code Online (Sandbox Code Playgroud)
我尝试过使用这些,但我不确定它是否适合我想要的东西.
有人能够提出一些解决这个问题的建议吗?
Nra*_*ras 13
您正在寻找这个功能np.fmax.它取两个数组的元素最大值,忽略NaN.
import numpy as np
a = np.array([1, 2, 3, 4, 5])
b = np.array([2, 4, 3, 5, 2])
c = np.fmax(a, b)
Run Code Online (Sandbox Code Playgroud)
输出是
array([2, 4, 3, 5, 5])
Run Code Online (Sandbox Code Playgroud)
与几乎所有其他numpy一样,比较是按元素完成的,返回一个完整的数组:
>>> b > a
array([ True, True, False, True, False], dtype=bool)
Run Code Online (Sandbox Code Playgroud)
那么,这是真是假?if声明应该怎么做呢?
Numpy的答案是它不应该试图猜测,它应该只是引发异常.
如果您想将其视为真,因为至少有一个值为true,请使用any:
>>> if np.any(b > a): print('Yes!')
Yes!
Run Code Online (Sandbox Code Playgroud)
如果您想将其视为假,因为并非所有值都为真,请使用all:
>>> if np.all(b > a): print('Yes!')
Run Code Online (Sandbox Code Playgroud)
但我很确定你不想要其中任何一个.要广播整个if/ else阵列上.
您当然可以将if/ elselogic 包装在函数中的单个值中,然后显式地将vectorize其调用并调用它:
>>> def mymax(a, b):
... if b > a:
... return b
... else:
... return a
>>> vmymax = np.vectorize(mymax)
>>> vmymax(a, b)
array([2, 4, 3, 5, 5])
Run Code Online (Sandbox Code Playgroud)
这是值得知道如何做...但很少值得做.使用本机矢量化函数通常采用更间接的方式 - 通常也是更直接的方式.
间接执行此操作的一种方法是使用True和False为数字1和0的事实:
>>> (b>a)*b + (b<=a)*a
array([2, 4, 3, 5, 5])
Run Code Online (Sandbox Code Playgroud)
这将添加1*b[i] + 0*a[i]when b>a和0*b[i] + 1*a[i]when b<=a.有点难看,但不太难理解.写这个有更清晰但更冗长的方法.
但是,让我们寻找更好,更直接的解决方案.
首先,请注意您的mymax函数将与Python的内置函数完全相同max,包含2个值:
>>> vmymax = np.vectorize(max)
>>> vmymax(a, b)
array([2, 4, 3, 5, 5])
Run Code Online (Sandbox Code Playgroud)
然后考虑一下这个有用的东西,numpy可能已经有了它.快速搜索将会出现maximum:
>>> np.maximum(a, b)
array([2, 4, 3, 5, 5])
Run Code Online (Sandbox Code Playgroud)