0

我正在尝试使用 numpy 绘制一些复杂的函数。一些工作代码的示例:

import numpy as np
from PIL import Image

size = 1000

w = np.linspace(-10, 10, size)
x, y = np.meshgrid(w, w)
r = x + 1j*y

def f(q):
    return np.angle(q)

z = f(r)

normalized = ((255/(np.amax(z) - np.amin(z)))*(z+abs(np.amin(z)))).astype(int)

data = [i for j in normalized for i in j]

img = Image.new('L', (size, size))
img.putdata(data[::-1]) #pixels are done bottom to top
img.show()

但是,假设我希望函数 f 在其中进行简单的比较,如下所示:

def f(q):
    if np.abs(q) < 4:
        return 1
    else:
        return 0

我得到错误

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

对于 np.abs(q) < 4 检查。

我做了一些挖掘并意识到这是因为 Python 正在对整个 r 数组进行操作,它无法将数组与整数进行比较。因此,我尝试寻找进行元素比较的方法。

这个页面看起来很有希望:它说我可以使用 np.less(a, b) 进行元素比较,所以我尝试了

def f(q):
    if np.less(np.abs(q), 4):
        return 1
    else:
        return 0

并得到相同的ValueError。似乎 np.less() 的两个参数都需要是相同大小的数组。

我想要的是将数组的每个元素与单个非数组数量进行比较。我想我可以制作一个相同大小的虚拟数组,其中填充相同的 4,但必须有一种更优雅的方式来做到这一点。

4

1 回答 1

0

关键是返回一个数组值,而不是试图将一个数组强制转换为一个布尔值,这是if (some_array):一直在尝试做的事情。没有明确的方法来决定单个布尔值np.array([True, False])应该转换成什么,它甚至没有尝试。

所以甚至不要分支:

def f(q):
    return abs(q) < 4

给出一个数组

>>> f(np.array([1,3,5]))
array([ True,  True, False], dtype=bool)

这就像数字一样

>>> f(np.array([1,3,5])).astype(int)
array([1, 1, 0])

并给

圆圈

于 2017-03-01T00:42:07.730 回答