Python 创建普通数组的多维数组

Python create multi dimensional array of of normal array

我想用普通数组创建一个多维数组。当我的起始数组中有 0 时,我想将行号更改为 1。

我的起始数组如下所示:

arr = [1, 2, 3, 0, 4, 5, 6, 0, 7, 8, 9]

我未来的多阵列应该是这样的:

multi_arr = [[1, 2, 3],
             [4, 5, 6],
             [7, 8, 9]]

到目前为止,我的代码如下所示:

multi_arr = []
end = len(arr)
i = 0   #row
j = 0   #column

for h in range(end):

   if arr[h] != 0:
       j += 1
       multi_arr[i][j]= arr[h]

   elif arr[i] != 0:
       i += 1

使用此代码时,我总是遇到列表索引错误。

这应该以更简单的方式完成工作:

arr = [1, 2, 3, 0, 4, 5, 6, 0, 7, 8, 9]

multi_arr = []

temp_arr = []
for h in arr:
    if h != 0:
        temp_arr.append(h)
    else:
        multi_arr.append(temp_arr)
        temp_arr = []

if h != 0:  # Insert the last array it the last number wasn't 0
    multi_arr.append(temp_arr)

print(multi_arr)

发生这种情况是因为在您尝试设置 multi_arr[i][j] 时,它仍然是 1-d array。您可以使用打印语句或调试器来验证这一点——像这样:

for h in range(end):

    if arr[h] != 0:
        print(multi_arr)
        j += 1
        multi_arr[i][j]= arr[h]

    elif arr[i] != 0:
        i += 1

我肯定会为你想要完成的事情尝试更多 pythonic,将元素读入临时数组并将该临时数组附加到多数组。

arr = [1, 2, 3, 0, 4, 5, 6, 0, 7, 8, 9]
multi_arr = []
temp_array = []

for item in arr:
    if item == 0:
        multi_arr.append(temp_array)
        temp_array = []
    else:
        temp_array.append(item)
multi_arr.append(temp_array)
        

print(multi_arr)

如果您真的想使用列表,则不需要列索引器。您只需将该值附加到正确的列表即可。


multi_arr = [[]]  # start with a nested list, since your vector doesnt start with a 0
endi = len(arr)
i = 0   #row

for h in range(endi):

   if arr[h] != 0:
       multi_arr[i].append(arr[h])
   else:
       i += 1
       multi_arr.insert(i,[])  # open new list

输出:

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

您正在声明一维数组并像二维数组一样追加 您的问题的一个解决方案是:

arr=[1,2,3,4,5,6,7,8,9]
multi_arr=[]
end = len(arr)
a = []
counter =0
for i in arr :
    if counter < 3 :
        a.append(i)
        counter += 1
    else:
        multi_arr.append(a)
        a=[]
        counter = 0
        a.append(i)
        counter += 1   
multi_arr.append(a)
print(multi_arr)

这是一个yield方法:

def f(arr):
    res = []
    for x in arr:
        if x == 0:
            yield res
            res = []
        else:
            res.append(x)
    yield res

list(f(arr))

#> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

适合您的不同方法:超级简单且无循环

import numpy as np

arr = [1, 2, 3, 0, 4, 5, 6, 0, 7, 8, 9]
a = [i for i in arr if i]
x = arr[arr!=0] + 1

np.array(a).reshape([-1, x])

输出:

array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

如果您需要列表,只需使用 np.array(a).reshape([x, y]).tolist()

One-liner:

将列表转换为 numpy 数组后 a = np.array(arr):

a[a!=0].reshape([-1, len(a) - np.count_nonzero(a)+1])