2011-05-02 29 views
0
  • 输入数据是一维numpy数组的列表例如x[0] = [ array([1.0,1.0,1.0]), array([2.0,2.0,2.0]), ...]
  • len(x)的数量级为几千(行),而len(x[n])是一个固定的数字(列),但可能会因运行而改变(所以我不想硬编码一些列)。
  • 功能f(x[n][col])将每个array成单个数
  • 期望的结果是转化的列

的列表对于绘制的列表,这样他们可能是一个numpy的数据结构。 下面是一些代码来设置测试数据和名义变换:numpy中的数据转换

import numpy 

# create test data set 
def datagen(number): 
    return numpy.array([number,number,number]) 

x=[] 
for rows in range(20): 
    dataline = [ datagen(n) for n in range(5)] 
    x.append(dataline) 

#define transformation of array to single number 
def f(in_array): 
    return in_array.sum() 

期望result--得到在numpy的,Python的排序的方式:

[ array([0,0,0,...0]), array([3,3,3,....,3]), array([6,6,6,...,6]), ..etc] 

其中在这种情况下,每个阵列具有20元素(每行数据一个),列表中有5个数组(每列一个)。

这是我目前的解决方案:

trans = [] 
for dataline in x: 
    trans.append([f(a) for a in dataline]) 

trans = numpy.array(trans) 
answer = [ trans[:,col] for col in range(len(x[0])) ] 

不是太寒酸,但我的头很痛,我有一种感觉,这是可以做到更好。 ??? (a)= numpy.sqrt(numpy.vdot(a,a))

+0

是什么'F'样子?为了引导一个函数,我们需要知道函数的作用。 – 2011-05-03 10:43:26

+0

嗨斯文,这是矢量的大小(编辑后)。 – Pete 2011-05-03 12:16:44

+1

你真的需要使用numpy数组列表吗?如果您刚开始使用3D阵列,这将是一个单线程。 ('ndarray.sum'可以很容易地沿单轴运行。) – 2011-05-05 01:40:47

回答

1

如何:

numpy.tile(numpy.arange(1,12).reshape(11,1),20) 
+0

比pythonic更多的numpy/matlab-ish,我猜。 – YXD 2011-05-02 18:40:42

+0

你可以用'x'和'f()'来表述吗? – Pete 2011-05-02 18:42:19

+0

啊,现在我正确地读了你的问题的开头。我的坏处是,我很快就达到了预期的结果,而忽视了投入。如果你想避免循环,你可能想要矢量化函数http://docs.scipy.org/doc/numpy/reference/generated/numpy.vectorize.html,但我现在没有时间来测试它出... – YXD 2011-05-02 18:49:11