我有一个有300个条目的numpy数组。在每个条目中是另一个numpy数组[2048 x 2048]。
每个条目都是" tiff"入口(矩阵形式),对应于检测器中的像素位置。现在,我想要做的是集中这个,以便我有一个[2048 x 2048]数组,每个条目有300个条目对应300帧的像素。
我想我找到了一种使用zip
功能的方法。但是,每次我回来[300 x 2048 x 2048]或[2048 x 300 x 2048]。
我想要一个[2048 x 2048 x 300]。我试图以一种相当经济和pythonic的方式做到这一点,而不仅仅是重新加载到一个新的数组并重新索引。
T_prime = zip(([list(t) for t in zip(*Tiffs)]))
其中Tiffs
是如上所述的数组。
答案 0 :(得分:2)
在numpy中,我们经常将dimmensions添加到数组而不是使用嵌套数组(这是带有示例列表的标准)。将所有数据放在一个阵列中后,就可以轻松对其进行操作。在你的情况下,看起来你正在寻找转置数组。一个例子:
import numpy as np
example_data = np.empty(30, dtype=object)
for i in range(30):
example_data[i] = np.zeros((100, 101))
structured = np.array(list(example_data))
print structured.shape
# (30, 100, 101)
print structured.transpose([1, 2, 0]).shape
# (100, 101, 30)
答案 1 :(得分:0)
你可以这样使用
result = map(lambda x: zip(*x) ,zip(*Tiffs))
这是完整的例子
list1 = [[1,2,3,4],[1,2,3,4],[1,2,3,4]]
list2 = [[5,6,7,8],[5,6,7,8],[5,6,7,8]]
listoflists = [list1,list2]
result = map(lambda x: zip(*x) ,zip(*listoflists))
print result
将导致
[[(1, 5), (2, 6), (3, 7), (4, 8)], [(1, 5), (2, 6), (3, 7), (4, 8)], [(1, 5), (2, 6), (3, 7), (4, 8)]]
答案 2 :(得分:0)
您是否会将此描述为包含3个项目的数组,其中每个项目都是2x4数组?
In [300]: Tiffs=np.arange(24).reshape(3,2,4)
In [301]: Tiffs
Out[301]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]],
[[16, 17, 18, 19],
[20, 21, 22, 23]]])
In [302]: Tiffs.shape
Out[302]: (3, 2, 4)
如果是这样,如何进行选择性转置?
In [304]: Tiffs.transpose(1,2,0)
Out[304]:
array([[[ 0, 8, 16],
[ 1, 9, 17],
[ 2, 10, 18],
[ 3, 11, 19]],
[[ 4, 12, 20],
[ 5, 13, 21],
[ 6, 14, 22],
[ 7, 15, 23]]])
In [305]: _.shape
Out[305]: (2, 4, 3)
它仍然是一个3d数组,但可以查看(2x4),每个包含3个项目。
另一种可能性是它实际上是一个对象数组,其中每个对象都是一个二维数组,但我认为你不得不付出额外的努力来构建它。
In [319]: Tiffs
Out[319]:
array([array([[0, 1, 2, 3],
[4, 5, 6, 7]]),
array([[ 8, 9, 10, 11],
[12, 13, 14, 15]]),
array([[16, 17, 18, 19],
[20, 21, 22, 23]])], dtype=object)
转置它比较棘手,因为它确实是(3)数组(2,4)数组,并且轴交换不会跨越object
边界。可能需要zip
的东西。 zip
可用于转置嵌套列表,但您的zip表达式有点令人困惑。