在 Python 中使用循环对数组进行切片并为每个小数组赋予特定的名称

Posted

技术标签:

【中文标题】在 Python 中使用循环对数组进行切片并为每个小数组赋予特定的名称【英文标题】:Slice array and give particular name to every small array by using loop in Python 【发布时间】:2019-05-14 08:31:43 【问题描述】:

我想把一个大数组分成几个小数组,给每个小数组起不同的名字。

我使用 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 重复,但是我真的不明白“变量变量”是什么意思,尽管我们都建议使用字典。

【问题讨论】:

How do I create a variable number of variables?的可能重复 嗨@Chunpin,您可以使用字典或二维列表来简化此问题。在下面检查我的答案:) 【参考方案1】:

最好的方法是创建一个字典:

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]])

【讨论】:

【参考方案2】:

你为什么要创建这么多变量,当你可以简单地创建一个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]])

【讨论】:

【参考方案3】:

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

【讨论】:

所以最好创建一个字典,二维列表,或者只保留原始数组并使用像 a[p:p+2,q:q+2] 这样的命令得到我想要的小数组?我是编码新手,实际上无法弄清楚这些方法的优点。

以上是关于在 Python 中使用循环对数组进行切片并为每个小数组赋予特定的名称的主要内容,如果未能解决你的问题,请参考以下文章

不用循环,python numpy 数组如何对每个元素进行操作?

对多个数组进行排序和切片[关闭]

如何切片 numpy 字符串数组的每个元素?

根据张量流中给定的序列长度数组对 3D 张量进行切片

通过python中的索引和数组对数据框进行切片

Go切片数组深度解析