2

我想从普通数组中创建一个多维数组。当我的起始数组中有 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

我总是收到此代码的列表索引错误。

4

6 回答 6

1

这是一种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]]
于 2020-08-27T14:35:38.610 回答
1

发生这种情况是因为在您尝试设置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)
于 2020-08-27T14:23:10.953 回答
1

如果您真的想使用列表,则不需要列索引器。您可以简单地将值附加到正确的列表中。


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]]
于 2020-08-27T14:24:16.610 回答
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)
于 2020-08-27T14:21:36.367 回答
1

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

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)
于 2020-08-27T14:26:24.920 回答
0

为您提供不同的方法:超级简单且无循环

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()改用。

单线:

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

a[a!=0].reshape([-1, len(a) - np.count_nonzero(a)+1])
于 2020-08-27T14:41:25.790 回答