2017-06-07 35 views
0

我一直在拼命地试图找出为什么阵列级联导致对第一次迭代乘以2的阵列...Numpy Array Concatenation将数组相乘...为什么?

这是我的代码:

def run(filename, max_iter = 1e6): 
    data, fm = data_extraction(filename) 

    large_output = None 

    iteration_count = 0  

    while iteration_count < max_iter: 
     iteration_count += 1 
     print iteration_count 
     results = calculations(data, (0.9,1.1)) 

     if large_output == None: 
      large_output = results[:,1] #stores the energy array 
      print large_output 
     else: 
      large_output = np.c_[ large_output, results[:,1]] 
      #large_output = np.vstack([large_output, power_and_energy_var[:,1]]) 
      print large_output 

,这是控制台输出打印语句,只有3次迭代:

1 
[ 3.59891391e+01 5.75841568e+00 ] 
2 
[[ 7.22402719e+01 3.62511328e+01] 
[ 1.16726670e+01 5.91425129e+00]] 
3 
[[ 7.22402719e+01 3.62511328e+01 3.70141435e+01] 
[ 1.16726670e+01 5.91425129e+00 6.02176042e+00]] 

正如你可以看到7.22402719e+01的两倍左右3.59891391e+01,但它不会为连续迭代发生...

我不知道为什么会发生这种情况。我已经尝试了所有我能想到可能关闭:

1)准确地检查正在使用打印语句 2)重新加载内核删除任何挥之不去的变量 3执行了什么)np.vstack用来代替np.c_(同错误)

任何帮助将非常欢迎!

+0

'large_output =结果[:,1]'走的results'的'一部分的图。如果它正在查看的数组发生更改,则该视图将反映这些更改。连接(尽管很慢并且一个坏主意)可能与你的问题无关。 – user2357112

+0

在第一次迭代中'large_output'或'results [:,1]'是否是空的?输出表明堆叠阵列在1D处存在,在连续阵列中是2D。 – Divakar

+0

@Divakar:在第一次迭代期间没有填满large_output,因为它是None。结果不是空的。 – Sorade

回答

0

尽管评论和答案中提出的所有非常好的意见和建议,答案都比这更简单(通常是我花了很长时间在计算机上敲打我的头)。

large_output = results[:,1]

应明确表示为一个数组:

large_output = np.array(results[:,1])

1

复制您的级联用一个简单的results阵列:

In [229]: results = np.arange(12).reshape(2,6) 
In [230]: out = results[:,1] 
In [231]: out = np.c_[out, results[:,2]] 
In [232]: out = np.c_[out, results[:,3]] 
In [233]: out 
Out[233]: 
array([[1, 2, 3], 
     [7, 8, 9]]) 

即使最初out是1D,随后的那些简单的拼接列

In [234]: results[:,1] 
Out[234]: array([1, 7]) 

所以CNT 1和2之间有任何差错是datacalculations中未知行为的结果。这不是一个连接问题np.c_

也就是说,先建名单的建议是一个很好的

In [237]: out = [] 
In [238]: out.append(results[:,1]) 
In [239]: out.append(results[:,2]) 
In [240]: out.append(results[:,3]) 
In [241]: out 
Out[241]: [array([1, 7]), array([2, 8]), array([3, 9])] 
In [242]: np.array(out) 
Out[242]: 
array([[1, 7], 
     [2, 8], 
     [3, 9]]) 

虽然它可能不会在创造results绕过任何不道德的行为。