2017-09-27 61 views
1

所以我想创建一个具有特定形状的for循环中的数组。我从一个形状为(14616, 145, 192)的3D数组开始,然后取出数据的平均值,并将其放入数组中。我期待在它得到一个一维数组14616个值使用下面的代码:在Python for循环中创建数组,但数据没有得到正确复制

data = np.zeros(14616)

for x in pr1: data = np.average(x)

当这样写新的阵列看起来像这样:

print data.shape print data () 2.37915e-05

无论出于何种原因,当这样写时,只需要计算最后的平均值并将其放入数组中,当我想要所有这些数值时。我弄了几个不同的东西,但似乎没有任何工作,我不知道它出错的地方。

+1

是的,因为你只是分配'np.average(X)'的结果'data',并丢弃您的阵列。 –

回答

1

您只需将您的mean计算结果分配给data即可。所以,如果我有x = [1,2,3],然后我x = 4,然后x == 4和原始列表被丢弃。

所以,当你说:

无论出于何种原因,这样当它只是服用计算,最后 平均值,并把该进阵列写...

这是错误的。它不是对数组做任何事情,它将在循环的每次迭代中将data重新分配为np.average(x)的值,因此,data将是最后一次迭代中的任何np.average(x)

无论如何,我会完全放弃你的循环方法,而是使用内置的np.mean,无论是函数还是方法。因此,使用玩具,例如:

>>> pr1 = np.random.randint(-5, 20, (8, 2, 3)) 
>>> pr1 
array([[[16, 4, -5], 
     [ 5, 16, 7]], 

     [[13, 16, -3], 
     [12, 10, 14]], 

     [[13, -4, 12], 
     [-5, 12, 1]], 

     [[ 9, -1, -3], 
     [14, 11, 15]], 

     [[12, 17, 14], 
     [16, 5, 2]], 

     [[-1, 13, -2], 
     [ 4, 9, 11]], 

     [[12, 8, 19], 
     [ 4, 9, -2]], 

     [[-4, -2, 1], 
     [ 8, -1, 14]]]) 
>>> 

然后简单:

>>> data = pr1.mean(axis=(1,2)) 
>>> data 
array([ 7.16666667, 10.33333333, 4.83333333, 7.5  , 
     11.  , 5.66666667, 8.33333333, 2.66666667]) 
>>> data.shape 
(8,) 
>>> pr1.shape 
(8, 2, 3) 
>>> 
+0

@AlexMorrison为了充分利用'numpy',尝试学习使用内置的矢量化方法。它们被实现为C扩展,并且被编译并且比普通的python循环快得多。 –

1

在你的循环for x in pr1:,你继续分配x的平均data,因此最后data只需要1倍的值。

您可以使用列表中理解和实现您的目标:

>>> data = np.random.rand(146,15,19) 
>>> data = np.array([np.average(j) for j in data]) 
>>> data.shape 
(146,) 
+0

这种方法也有效,但由于某种原因花了很长时间才能运行。 –