【问题标题】:Python: element-wise comparison of array to non-arrayPython:数组与非数组的逐元素比较
【发布时间】:2017-03-01 00:21:47
【问题描述】:

我正在尝试使用 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)

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

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

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

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

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

【问题讨论】:

    标签: python arrays numpy elementwise-operations


    【解决方案1】:

    关键是返回一个数组值,而不是试图将一个数组强制转换为一个布尔值,这是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])
    

    并给予

    【讨论】:

    • 如果我需要它来分支怎么办?我正在尝试做的真正问题是绘制 Mandelbrot 分形。这需要检查每个点是否在某个函数的迭代下发散,并且在任何一种情况下我都需要它来做不同的事情。
    • @dain: 那么你要么需要以不需要单独分支的方式重写你的公式(例如np.where(np.array([1,2,3]) &gt; 2, 10, 11)),要么以标量形式编写方程,然后使用@ 987654329@。你会失去一些性能。与后者。另外:像这样的问题就是为什么通常最好让你的帖子与你的实际目标相似。如果你简化得太早,那么你会得到你实际提出的问题的答案(“我想要的是将我的数组的每个元素与单个非数组数量进行比较”),而不是你想要但没有的那个不要问。
    猜你喜欢
    • 2020-07-25
    • 2022-01-08
    • 1970-01-01
    • 2018-06-23
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    相关资源
    最近更新 更多