切片数组并通过使用Python中的循环为每个小数组指定特定的名称

时间:2019-05-14 08:31:43

标签: python arrays loops

我想将一个大数组切成小数组,并为每个小数组取不同的名称。

我使用2 for循环将10 * 10大数组切成25 2 * 2数组,我可以在每个循环中将它们打印出来,但是我没有给每个数组指定特定的名称。 我还尝试将'.format()'函数组合到循环中,但仍然失败。

下面的代码工作正常,并打印出我想要的切片2 * 2矩阵:

import numpy as np

a = np.arange(100).reshape(10, 10)

for p in range(0,a.shape[0],2):
    for q in range(0,a.shape[1],2):
        print(a[p:p+2,q:q+2])

但是当我尝试为每个生成的数组生成特定名称时,以下代码失败:

import numpy as np

a = np.arange(100).reshape(10, 10)

for p in range(0,a.shape[0],2):
    for q in range(0,a.shape[1],2):
        'slice_{0}_{1}'.format(p,q) = a[p:p+2,q:q+2]

我希望获得以下格式的数组:

slice_0_0 = array([[ 0, 1],[10,11]])
slice_0_2 = array([[ 2, 3],[12,13]])
...
slice_8_8 = array([[88,89],[98,99]])

这样我可以将这些数组应用为数组名称,而不是直接加载原始的大数组。

  • 有人提到我这个问题可能是this one的重复,但是尽管我们都建议使用字典,但我确实没有得到“变量”的含义。

3 个答案:

答案 0 :(得分:5)

最好的方法是创建词典:

d={}

for p in range(0,a.shape[0],2):
    for q in range(0,a.shape[1],2):
        d['slice_{0}_{1}'.format(p,q)] = a[p:p+2,q:q+2]

In [7] : d['slice_0_0']
Out[7] : array([[ 0,  1], [10, 11]])

答案 1 :(得分:0)

为什么只创建9x9的二维列表并使用它的索引来表示变量名,为什么要创建这么多变量

import numpy as np

a = np.arange(100).reshape(10, 10)

#2D list of 9x9
slice = [ [0 for _ in range(9)] for _ in range(9)]
for p in range(0,a.shape[0],2):
    for q in range(0,a.shape[1],2):
        #Assign elements to the 2D list
        slice[p][q] = a[p:p+2,q:q+2]

print(slice)

然后,您可以使用变量名中使用的相同索引来访问任何变量

#slice_0_0
print(slice[0][0])
#slice_0_2
print(slice[0][2])
#slice_8_8
print(slice[8][8])

输出将为

[[ 0  1]
 [10 11]]
[[ 2  3]
 [12 13]]
[[88 89]
 [98 99]]

解决此问题的另一种方法是使用带有键的dictionary作为切片变量名称

import numpy as np

a = np.arange(100).reshape(10, 10)

#Dictionary for slice variables
slice = {}

for p in range(0,a.shape[0],2):
    for q in range(0,a.shape[1],2):
        #Assign values to appropriate keys
        key = 'slice_{0}_{1}'.format(p,q)
        slice[key] = a[p:p+2,q:q+2]

print(slice)

输出将为

{'slice_0_0': array([[ 0,  1],
       [10, 11]]), 'slice_0_2': array([[ 2,  3],
       [12, 13]]), 'slice_0_4': array([[ 4,  5],
       [14, 15]]), 'slice_0_6': array([[ 6,  7],
       [16, 17]]), 'slice_0_8': array([[ 8,  9],
       [18, 19]]), 'slice_2_0': array([[20, 21],
       [30, 31]]), 'slice_2_2': array([[22, 23],
       [32, 33]]), 'slice_2_4': array([[24, 25],
       [34, 35]]), 'slice_2_6': array([[26, 27],
       [36, 37]]), 'slice_2_8': array([[28, 29],
       [38, 39]]), 'slice_4_0': array([[40, 41],
       [50, 51]]), 'slice_4_2': array([[42, 43],
       [52, 53]]), 'slice_4_4': array([[44, 45],
       [54, 55]]), 'slice_4_6': array([[46, 47],
       [56, 57]]), 'slice_4_8': array([[48, 49],
       [58, 59]]), 'slice_6_0': array([[60, 61],
       [70, 71]]), 'slice_6_2': array([[62, 63],
       [72, 73]]), 'slice_6_4': array([[64, 65],
       [74, 75]]), 'slice_6_6': array([[66, 67],
       [76, 77]]), 'slice_6_8': array([[68, 69],
       [78, 79]]), 'slice_8_0': array([[80, 81],
       [90, 91]]), 'slice_8_2': array([[82, 83],
       [92, 93]]), 'slice_8_4': array([[84, 85],
       [94, 95]]), 'slice_8_6': array([[86, 87],
       [96, 97]]), 'slice_8_8': array([[88, 89],
       [98, 99]])}

答案 2 :(得分:0)

看看许多可能的答案here,但我认为通常这样做是个坏主意。您最好只做slice[p][q]