【发布时间】:2018-02-07 13:39:14
【问题描述】:
我想在 python 中重塑一个数组(最初是一个 numpy 数组),使第一个索引处的每个元素都成为该数组中的一个正方形/象限,而不是采用一行中的所有元素的常规重塑。
这是一次重塑+重组。
当然,这是最快/更好的方法:)
(首选python 3.5)
使用形状为行、列、通道的数组。
例如,我创建了这个数组,您可以将其解释为图像。我已经为其添加了值,因此我们可以清楚地看到每个元素属于哪个行、列和通道:
import numpy as np
X = np.zeros((8,6,3)) #8 rows, 6 columns, 3 channels (imagine RGB channels)
for i in range(3):
X[:,:,i] += i+1 #the last digit in the array elements are channels
for i in range(6):
X[:,i,:] += 10*(i+1) #the second digit in elements are columns
for i in range(8):
X[i,:,:] += 100*(i+1) #the first digit in elements are rows
打印这个数组显示:
[[[ 111. 112. 113.]
[ 121. 122. 123.]
[ 131. 132. 133.]
[ 141. 142. 143.]
[ 151. 152. 153.]
[ 161. 162. 163.]]
[[ 211. 212. 213.]
[ 221. 222. 223.]
[ 231. 232. 233.]
[ 241. 242. 243.]
[ 251. 252. 253.]
[ 261. 262. 263.]]
...
- 因此,很明显第一个索引被分组为图像行(每个更大的组中的第一个数字都是恒定的)
- 第二个索引是列,它们在大的每个较小的组中变化
- 最后一个索引是通道,它们会单独更改,在较小的组中逐个元素地变化。
常规重塑不满足我的条件
现在,假设我想将该数组重塑为 12 个正方形,每个正方形为 2 x 2(两行两列),将通道保持为最后一个维度。
如果我只是 print(X.reshape(12,2,2,3)),我会得到这个:
[
[
[
[ 111. 112. 113.]
[ 121. 122. 123.]
]
[
[ 131. 132. 133.]
[ 141. 142. 143.]
]
]
[
[
[ 151. 152. 153.]
[ 161. 162. 163.]
]
[
[ 211. 212. 213.]
[ 221. 222. 223.]
]
]
....
第一个索引将第一行的所有元素分组(它们从 1 开始)。因此,它不是在图像中采用“正方形”,而是将事物分组成一条直线。在第 1 行的所有列都被取走之前,它永远不会从第 2 行取元素。
预期结果
如何正确有效地重塑它,以便第一个索引返回正方形(2 行,2 列),如下所示:
[
[
[
[ 111. 112. 113.]
[ 121. 122. 123.]
]
[
[ 211. 212. 213.]
[ 221. 222. 223.]
]
]
[
[
[ 131. 132. 133.]
[ 141. 142. 143.]
]
[
[ 231. 232. 233.]
[ 241. 242. 243.]
]
]
[
[
[ 151. 152. 153.]
[ 161. 162. 163.]
]
[
[ 251. 252. 253.]
[ 261. 262. 263.]
]
]
[
[
[ 311. 312. 313.]
[ 321. 322. 323.]
]
[
[ 411. 412. 413.]
[ 421. 422. 423.]
]
]
....
【问题讨论】:
标签: python sorting numpy image-processing reshape