繁体   English   中英

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()代替。

单线:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM