Numpy:array> 5产生"具有多个元素的数组的真值是不明确的"

时间:2016-08-23 13:21:15

标签: python numpy

我知道在numpy中你不能简单地在数组上做条件因为它不知道如何对待它们而且这个错误是由于这个,但在我的情况下我的代码很多简单。我有:

# H and _H are 3x3 arrays with hand-assigned values
# uv1 is 3x57600 array of coordinates, hand assigned in a loop
HH = np.dot(_H,np.linalg.inv(H))
new_uv = np.dot(HH,uv1)
du = uv1[0,:] * new_uv[2,:]
u = new_uv[0,:] - du
u_greater_5 = u > 5

最后一行给出了" ValueError:具有多个元素的数组的真值是不明确的。使用a.any()或a.all()"错误。你的形状(57600,),我可以打开互动提示,以下工作正常:

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

但是上一个区块中的代码并没有。我也试过了

np.greater(u,5)
u[u>5] = 1

但他们也会犯同样的错误。有什么想法吗?

另外,我不知道这是否相关,但奇怪的是,尝试访问u [0]给我一个3矢量相同的3个值(u中的第一个值),而它应该是标?考虑到它的形状是(57600,)?

编辑:跟踪,根据请求:

Traceback (most recent call last):
  File "ros2vid.py", line 333, in <module>
    process_frames(bag)
  File "ros2vid.py", line 239, in process_frames
    u_greater_5 = u > 5
  ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

以下是我如何生成uv1:

# frame is an image loaded from a ros bag
uv1 = []
im_r = frame.shape[0]
im_c = frame.shape[1]
for i in range(1, im_r):
    for j in range(im_c):
        uv1.append([j, i, 1])
uv1 = np.transpose(np.array(uv1))

并且H和_H的值只是我手工硬编码的数字。类似的东西:

h11 = u0 * cosphi
h12 = -alph_u
h13 = alph_u + u0 * (-cosphi + cz * sinphi)
h21 = -alph_u * sinphi + v0 * cosphi
h22 = 0
h23 = alph_v * (sinphi + cz * cosphi) + v0 * (-cosphi + cz * sinphi)
h31 = cosphi
h32 = 0
h33 = -cosphi + cz * sinphi
H = np.array([[h11, h12, h13], [h21, h22, h23], [h31, h32, h33]])

像u0,cosphi,cz等那样的所有值都只是标量。我已经单独检查了它们,并且_H也被分配了类似的。我检查了H和_H的形状,并验证它们是3x3。

奇怪的是,我只是尝试了你= = 5并且没有给我一个错误,你&gt; 5确实。

2 个答案:

答案 0 :(得分:4)

我怀疑u是一个对象的一维数组,对象本身就是一维numpy数组,长度为3.我可以重现你报告的行为如下。首先,创建一维对象数组(长度为3),并用numpy数组填充它:

In [26]: u = np.empty(3, dtype=object)

In [27]: u[:] = [np.array([1, 2, 3]), np.array([4, 5, 6]), np.array([7, 8, 9])]

检查u的类型和属性。首先,它是一个具有形状(3,)的numpy数组。

In [28]: type(u)
Out[28]: numpy.ndarray

In [29]: u.shape
Out[29]: (3,)

u的第一个元素是长度为3的数组:

In [30]: u[0]
Out[30]: array([1, 2, 3])

dtype的{​​{1}}为u,这是dtype('O')数据类型的numpy表示。 (如果您打印 object,它会显示u.dtype。)

object

现在尝试In [31]: u.dtype Out[31]: dtype('O')

u > 5

In [32]: u > 5 --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-32-7f680a2a9455> in <module>() ----> 1 u > 5 ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 不会生成错误,但会生成警告,并返回标量错误:

u == 5

要弄清楚为什么In [33]: u == 5 /Users/warren/miniconda3/bin/ipython:1: DeprecationWarning: elementwise == comparison failed; this will raise an error in the future. #!/bin/bash /Users/warren/miniconda3/bin/python.app Out[33]: False 是一个对象数组,您可以向后工作,检查用于创建u的变量的.shape.dtype属性。

答案 1 :(得分:1)

我用随机变量重新创建了你的代码。但它在这里工作正常:

import numpy as np
H = np.random.rand(3,3)*10
_H = np.random.rand(3,3)*10
uv1 = np.random.rand(3,57600)*10
HH = np.dot(_H,np.linalg.inv(H))
new_uv = np.dot(HH,uv1)
du = uv1[0,:] * new_uv[2,:]
u = new_uv[0,:] - du
u_greater_5 = u > 5

我不知道它是否取决于H_Huv1的值。您可以复制粘贴我的代码并验证您是否遇到该代码问题。