【问题标题】:numpy.insert() function insert array into wrong indexnumpy.insert() 函数将数组插入错误的索引
【发布时间】:2019-02-15 19:02:50
【问题描述】:

在这里,我的代码实现了文本文件的值;并将矩阵创建为多维数组,但问题是代码创建了更多的二维数组,我无法操作,我需要二维数组,我该怎么做?

解释我的代码的算法:

代码的Moto:我的代码从特定文件夹中获取值,每个文件夹包含7个'txt'文件,从一个用户生成,这样多个文件夹包含多个用户的多个数据。

step1: 启动第一个for循环,并使用特定文件夹中有多少个文件夹来控制它,并在变量'path'中存储第一个文件夹的第一个路径。

step2:使用第二个for循环打开路径并获取7个txt文件的数据。完成后,它关闭第二个for循环并执行其余代码。

step3:将7个txt文件的数据拼接到一个一维数组中。

step4: 使用获取2个文件夹的数据创建二维数组

第5步(这里出现问题):在二维数组ind插入id数组中创建一行

import numpy as np
import array as arr
import os
f_path='Result'
array_control_var=0

#for feacth directory path
for (path,dirs,file) in os.walk(f_path):
    if(path==f_path):
        continue
    f_path_1= path +'\page_1.txt'
    #Get data from page1 indivisualy beacuse there string type data exiest
    pgno_1 = np.array(np.loadtxt(f_path_1, dtype='U', delimiter=','))

    #only for page_2.txt
    f_path_2= path +'\page_2.txt'
    with open(f_path_2) as f:
        str_arr = ','.join([l.strip() for l in f])
    pgno_2 = np.asarray(str_arr.split(','), dtype=int)

    #using loop feach data from those text file.datda type = int
    for j in range(3,8):
    #store file path using variable
        txt_file_path=path+'\page_'+str(j)+'.txt'


        if os.path.exists(txt_file_path)==True:

            #genarate a variable name that auto incriment with for loop
            foo='pgno_'+str(j)
        else:
            break

        #pass the variable name as string and store value
        exec(foo + " = np.array(np.loadtxt(txt_file_path, dtype='i', delimiter=','))")

    #marge all array from page 2 to rest in single array in one dimensation
    f_array=np.concatenate((pgno_2,pgno_3,pgno_4,pgno_5,pgno_6,pgno_7), axis=0)

    #for first time of the loop assing this value
    if array_control_var==0:
        main_f_array=f_array
    if array_control_var==1:

        #here use np.array()
        main_f_array=np.array([main_f_array,f_array])
    else:
        main_f_array=np.insert(main_f_array, array_control_var, f_array, 0)

    array_control_var+=1

print(main_f_array)

我想要这样的输出

初始 [[0,0,0],[0,0,0,]]

插入后 [[0,0,0],[0,0,0],[0,0,0]]

但输出是

[array([0,  0,  0])
array([0,  0,  0])
0 0 0]

【问题讨论】:

  • 重复insert(或附加等)到数组是一种不好的做法。很难做到正确,而且速度很慢。将您的值收集在一个列表中,并在最后创建一次数组。
  • 其实这不可能,我从文本文件中获取数据,函数返回numpy.array类型,我如何获取数据作为列表?
  • 收集列表中的数组

标签: python arrays numpy multidimensional-array insert


【解决方案1】:

当我建议用列表构建替换 insert 时,这就是我的想法。

import numpy as np

alist = []
for i in range(4): 
    f_array = np.array([i, i+2, i+4])
    alist.append(f_array)

print(alist)
main_f_array = np.array(alist)

print(main_f_array)

试运行:

1246:~/mypy$ python3 stack54715610.py 
[array([0, 2, 4]), array([1, 3, 5]), array([2, 4, 6]), array([3, 5, 7])]
[[0 2 4]
 [1 3 5]
 [2 4 6]
 [3 5 7]]

如果你的文件加载产生大小不同的数组,你会得到不同的结果

f_array = np.arange(i, i+1+i)

1246:~/mypy$ python3 stack54715610.py 
[array([0]), array([1, 2]), array([2, 3, 4]), array([3, 4, 5, 6])]
[array([0]) array([1, 2]) array([2, 3, 4]) array([3, 4, 5, 6])]

这是一个 1d 对象 dtype 数组,而不是 2d。

【讨论】:

  • 现在解决了,我谨记您的建议,非常感谢:)
【解决方案2】:

正如我评论的那样,使用insert(或concatenate 的变体)收集数组很难正确完成,而且工作时速度很慢。它每次都会构建一个全新的数组。将数组收集到一个列表中,并在最后构建一个数组更容易、更快。列表追加高效且易于使用。

也就是说,您报告的结果看起来很可疑。我可以通过以下方式重现它:

In [281]: arr = np.zeros(2, object)
In [282]: arr
Out[282]: array([0, 0], dtype=object)
In [283]: arr[0] = np.array([0,0,0])
In [284]: arr[1] = np.array([0,0,0])
In [285]: arr
Out[285]: array([array([0, 0, 0]), array([0, 0, 0])], dtype=object)
In [286]: np.insert(arr, 2, np.array([0,0,0]), 0)
Out[286]: array([array([0, 0, 0]), array([0, 0, 0]), 0, 0, 0], dtype=object)

在较早的迭代中,main_f_array 必须已创建为对象 dtype 数组。

如果它是一个“普通”二维数组,则插入会有所不同:

In [287]: arr1 = np.zeros((2,3),int)
In [288]: np.insert(arr1, 2, np.array([0,0,0]), 0)
Out[288]: 
array([[0, 0, 0],
       [0, 0, 0],
       [0, 0, 0]])

或者按照我的想法进行迭代:

In [289]: f_array = np.array([0,0,0])
In [290]: main = f_array
In [291]: main = np.array([main, f_array])
In [292]: main
Out[292]: 
array([[0, 0, 0],
       [0, 0, 0]])
In [293]: main = np.insert(main, 2, f_array, 0)
In [294]: main
Out[294]: 
array([[0, 0, 0],
       [0, 0, 0],
       [0, 0, 0]])

【讨论】:

  • 我如何生成正常的二维数组,因为我的函数 "np.loadtxt(f_path_1, dtype='U', delimiter=',')" 和 "np.asarray(str_arr.split(', '), dtype=int)" 返回另一种类型的数组@hpaulj
  • 是的,从文件中收集数组时,请密切注意形状(和 dtype)。不匹配可能会导致意外的对象 dtype 集合。
猜你喜欢
  • 2021-04-28
  • 1970-01-01
  • 2018-02-25
  • 1970-01-01
  • 2018-05-04
  • 2021-10-22
  • 1970-01-01
  • 1970-01-01
  • 2016-03-06
相关资源
最近更新 更多