使用Python在数组中修改列表

时间:2013-12-06 23:48:26

标签: python arrays heap

我正在尝试使用以下格式构建列表:

(T,DT,数组)

其中t是time -float-,dt也是一个浮点数组是一个int数组,表示我的系统状态。我希望第一个元素在数组中排序元素,即t。所以我的看法是使用Python提供的堆结构。

我正在尝试的是:

import numpy as np 
import scipy as sp
import matplotlib.pyplot as plt
import heapq

popsize = 10

populat = [ (0,0,np.random.randint(0,2,Nsize)) for count in range(popsize)]
heapq.heapify(populat)  # Structure to order efficiently 

然而,这会返回以下内容:

ValueError:具有多个元素的数组的真值是不明确的。使用a.any()或a.all()

那么有人知道它怎么能这样做?或错误来自哪里?

我正在使用Ubuntu 12.04,运行python 2.7和ipython 1.1。

我将非常感激,非常感谢。

3 个答案:

答案 0 :(得分:2)

(0,0,np.random.randint(0,2,Nsize))

前两个元素不是tdt。它们都是0.因此,元组比较试图比较第3个槽中的数组,并发现它不会产生有意义的布尔结果。你的意思是在前两个插槽中有意义吗?

答案 1 :(得分:1)

至于错误的来源:

>>> a = (0, 0, np.random.randint(0, 2, 3))
>>> a
(0, 0, array([0, 0, 1]))
>>> b = (0, 0, np.random.randint(0, 2, 3))
>>> a
(0, 0, array([0, 0, 1]))
>>> a == b

原因是numpy以非标准方式覆盖比较运算符。它返回一个numpy boolean array

,而不是返回一个布尔结果

答案 2 :(得分:0)

所以我最终做的是在列表中添加另一个元素以使初始比较成为可能:

populat = [ (0,0,i,np.random.randint(0,2,Nsize)) for i in range(popsize)]

如上所述,如果两个第一个元素相等,则比较将转到由于bolean逻辑数组而返回错误的第三个元素(数组)。

方法是为列表中的每个成员创建一个不同的元素,该元素禁止在该数组级别进行比较(这就是我正在做的事情)。