如何";扩展;Python中的数组?

如何";扩展;Python中的数组?,python,arrays,numpy,Python,Arrays,Numpy,我想以某种方式扩展python中的2d数组 无回路 F.e.如果是: [[255, 255, 255], [255, 255, 255], [255, 255, 255]] 我想把它扩展到2的因子,得到如下结果: [[255, 0, 255, 0, 255, 0], [0, 0, 0, 0, 0, 0], [255, 0, 255, 0, 255, 0], [0, 0, 0, 0, 0, 0], [255, 0, 255, 0, 255, 0

我想以某种方式扩展python中的2d数组

无回路

F.e.如果是:

[[255, 255, 255],
     [255, 255, 255],
     [255, 255, 255]]
我想把它扩展到2的因子,得到如下结果:

[[255, 0, 255, 0, 255, 0],
  [0,  0,  0,  0,  0,  0],
 [255, 0, 255, 0, 255, 0],
  [0,  0,  0,  0,  0,  0],
 [255, 0, 255, 0, 255, 0],
  [0,  0,  0,  0,  0,  0]]
等等,如果按4倍计算


有什么功能吗?

您可以不使用numpy,仅通过列表理解来完成此操作,但它很复杂:

lst = [[255, 255, 255],
       [255, 255, 255],
       [255, 255, 255]]
extend_list = [ [lst[j // 2][i // 2] if j % 2 == 0 and i % 2 == 0 else 0 for i in range( 2 * (len(lst[j // 2])) )] if j != len(2 * lst) else [0 for _ in range( (2 * len(lst)) -1)] for j in range(2 * (len(lst)) )]

print(extend_list)
输出:

[[255, 0, 255, 0, 255, 0], [0, 0, 0, 0, 0, 0], [255, 0, 255, 0, 255, 0], [0, 0, 0], [255, 0, 255, 0, 255, 0], [0, 0, 0, 0, 0, 0]]

下面是一个使用numpy的解决方案。您没有提供N=4的示例,因此我猜测:

import numpy as np

arr = np.array([[255, 255, 255], [255, 255, 255], [255, 255, 255]])
factor = 4

print(arr)
nx, ny = arr.shape
if nx != ny:
    raise Exception("Array is not square")

step = 2 + factor//2 - 1
stop = nx * step
print('stop:', stop)
print('step:', step)

for x in range(1,stop,step):
    print()
    nx, ny = arr.shape
    print('x:', x)
    value = [[0]*nx]*(factor//2)
    print('Inserting columns:', value)
    arr = np.insert(arr, x, value, axis=1)
    nx, ny = arr.shape
    print(arr)
    value = [[0]*ny]*(factor//2)
    print('Inserting rows:', value)
    arr = np.insert(arr, x, value, axis=0)
    print(arr)

[[255 255 255]
 [255 255 255]
 [255 255 255]]
stop: 9
step: 3

x: 1
Inserting columns: [[0, 0, 0], [0, 0, 0]]
[[255   0   0 255 255]
 [255   0   0 255 255]
 [255   0   0 255 255]]
Inserting rows: [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
[[255   0   0 255 255]
 [  0   0   0   0   0]
 [  0   0   0   0   0]
 [255   0   0 255 255]
 [255   0   0 255 255]]

x: 4
Inserting columns: [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
[[255   0   0 255   0   0 255]
 [  0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0]
 [255   0   0 255   0   0 255]
 [255   0   0 255   0   0 255]]
Inserting rows: [[0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]]
[[255   0   0 255   0   0 255]
 [  0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0]
 [255   0   0 255   0   0 255]
 [  0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0]
 [255   0   0 255   0   0 255]]

x: 7
Inserting columns: [[0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]]
[[255   0   0 255   0   0 255   0   0]
 [  0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0]
 [255   0   0 255   0   0 255   0   0]
 [  0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0]
 [255   0   0 255   0   0 255   0   0]]
Inserting rows: [[0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0]]
[[255   0   0 255   0   0 255   0   0]
 [  0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0]
 [255   0   0 255   0   0 255   0   0]
 [  0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0]
 [255   0   0 255   0   0 255   0   0]
 [  0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0]]

您可以使用零创建新的更大数组

factor = 2

h, w = arr.shape[:2]

new_w = h*factor
new_h = h*factor

new_arr = np.zeros((new_h, new_w), np.uint8)
然后,您可以使用
for
-循环和
范围(0,新的系数)
来获取值及其新位置

for row, y in zip(arr, range(0, new_h, factor)):
    for value, x in zip(row, range(0, new_w, factor)):
        new_arr[y,x] = value
给予

如果在
范围
中使用不同的值而不是
0
,则可以获得
偏移量

offset_y = 1
offset_x = 1
for row, y in zip(arr, range(offset_y, new_h, factor)):
    for value, x in zip(row, range(offset_x, new_w, factor)):
        new_arr[y,x] = value
给出:

[[  0   0   0   0   0   0]
 [  0 255   0 255   0 255]
 [  0   0   0   0   0   0]
 [  0 255   0 255   0 255]
 [  0   0   0   0   0   0]
 [  0 255   0 255   0 255]]

工作代码

import numpy as np

arr = np.array([[255, 255, 255],
     [255, 255, 255],
     [255, 255, 255]]
)

factor = 2

h, w = arr.shape[:2]

new_w = h*factor
new_h = h*factor

new_arr = np.zeros((new_h, new_w), np.uint8)

offset_x = 0
offset_y = 0
for row, y in zip(arr, range(offset_y, new_h, factor)):
    #print(row, y)
    for value, x in zip(row, range(offset_x, new_w, factor)):
        #print(y, x, value)
        new_arr[y,x] = value
        
print(new_arr)        
                  

顺便说一句:您甚至可以使用具有不同值的
因子x
因子y

比如说

factor_x = 4
factor_y = 2
编码

import numpy as np

arr = np.array([[255, 255, 255],
     [255, 255, 255],
     [255, 255, 255]]
)

factor_x = 4
factor_y = 2

h, w = arr.shape[:2]
new_w = h*factor_x
new_h = h*factor_y
new_arr = np.zeros((new_h, new_w), np.uint8)

offset_x = 0
offset_y = 0
for row, y in zip(arr, range(offset_y, new_h, factor_y)):
    #print(row, y)
    for value, x in zip(row, range(offset_x, new_w, factor_x)):
        #print(y, x, value)
        new_arr[y,x] = value
        
print(new_arr)        
                  
给予


通过切片扩展很简单:

array = np.array([[255, 255, 255], [255, 255, 255], [255, 255, 255]])
factor = 2

extended_array = np.zeros((array.shape[0]*factor, array.shape[1]*factor))
extended_array[::factor,::factor] = array

如果将形状改为一列,则可以添加第二列的零,并且在重新调整后,应该有垂直列的零。您可能需要类似的东西来放置带零的水平行。或者,首先您应该创建只带零的新数组6x6,然后从旧数组复制值谢谢,我更正了。因为它是2d数组你有列表还是numpy数组?这是一个数组,但是转换成listsyeah没有问题,我一直在想。但是这里我们再次讨论循环,对吗?它不是一个循环,它的列表太棒了!感谢您的链接与矢量化的numpy函数相比,列表理解仍然一次一个地遍历每个元素
列表理解可以转换为正常的
for
-循环,这样会更简单。
[[255   0   0   0 255   0   0   0 255   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0]
 [255   0   0   0 255   0   0   0 255   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0]
 [255   0   0   0 255   0   0   0 255   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0]]
array = np.array([[255, 255, 255], [255, 255, 255], [255, 255, 255]])
factor = 2

extended_array = np.zeros((array.shape[0]*factor, array.shape[1]*factor))
extended_array[::factor,::factor] = array