在python中使用for循环创建3d numpy数组

ukdjmx9f  于 2023-02-08  发布在  Python
关注(0)|答案(3)|浏览(161)

我有2维训练数据。(4个特征200结果)
我证明了100个不同的应用程序与10个重复产生1000 csv文件。
我想为机器学习把每个csv结果叠加起来,但是我不知道怎么做。
我的每个csv文件看起来像下面.
test1.csv到numpy数组数据

[[0 'crc32_pclmul' 445 0]
 [0 'crc32_pclmul' 270 4096]
 [0 'crc32_pclmul' 234 8192]
 ...
 [249 'intel_pmt' 272 4096]
 [249 'intel_pmt' 224 8192]
 [249 'intel_pmt' 268 12288]]

我试过下面的python代码。

path = os.getcwd()
csv_files = glob.glob(os.path.join(path, "*.csv"))
cnt=0
for f in csv_files:
    cnt +=1
    seperator = '_'
    app = os.path.basename(f).split(seperator, 1)[0]

    if cnt==1:
        a = np.array(preprocess(f))
        b = np.array(app)
    else:
        a = np.vstack((a, np.array(preprocess(f))))
        b = np.append(b,app)
print(a)
print(b)

预处理函数返回每个csv文件的www.example.com_numpy结果。df.to_numpy results for each csv files.
我的期望值如下。a(1000,200,4)

[[[0 'crc32_pclmul' 445 0]
 [0 'crc32_pclmul' 270 4096]
 [0 'crc32_pclmul' 234 8192]
 ...
 [249 'intel_pmt' 272 4096]
 [249 'intel_pmt' 224 8192]
 [249 'intel_pmt' 268 12288]],
[[0 'crc32_pclmul' 445 0]
 [0 'crc32_pclmul' 270 4096]
 [0 'crc32_pclmul' 234 8192]
 ...
 [249 'intel_pmt' 272 4096]
 [249 'intel_pmt' 224 8192]
 [249 'intel_pmt' 268 12288]],
...
[[0 'crc32_pclmul' 445 0]
 [0 'crc32_pclmul' 270 4096]
 [0 'crc32_pclmul' 234 8192]
 ...
 [249 'intel_pmt' 272 4096]
 [249 'intel_pmt' 224 8192]
 [249 'intel_pmt' 268 12288]]]

然而,我得到了这个。a(200000,4)

[[0 'crc32_pclmul' 445 0]
 [0 'crc32_pclmul' 270 4096]
 [0 'crc32_pclmul' 234 8192]
 ...
 [249 'intel_pmt' 272 4096]
 [249 'intel_pmt' 224 8192]
 [249 'intel_pmt' 268 12288]]

我想使用[0]到[1000]访问每个csv结果,每个子数组看起来像(200,4)我该如何解决这个问题?我完全不知所措

2wnc66cl

2wnc66cl1#

是的,这就是vstack(和append)的作用,它合并同一个轴(行轴)上的内容。

a1=np.arange(10).reshape(2,5)
# [[0,1,2,3,4],
#  [5,6,7,8,9]]
a2=np.arange(10,20).reshape(2,5)
# [[10, 11, 12, 13, 14],
#  [15, 16, 17, 18, 19]])
np.vstack((a1,a2))
# [[ 0,  1,  2,  3,  4],
#  [ 5,  6,  7,  8,  9],
#  [10, 11, 12, 13, 14],
#  [15, 16, 17, 18, 19]])

b1=np.arange(5)
b2=np.arange(5,10)
np.append(b1,b2)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

如果您希望(从这些示例中)沿着一个新轴追加,那么您需要添加它,或者使用更灵活的stack

np.vstack(([a1],[a2]))
#array([[[ 0,  1,  2,  3,  4],
#       [ 5,  6,  7,  8,  9]],
#
#      [[10, 11, 12, 13, 14],
#       [15, 16, 17, 18, 19]]])

或者,在1d的情况下,使用vstack代替append

np.vstack((b1,b2))
#array([[0, 1, 2, 3, 4],
#       [5, 6, 7, 8, 9]])

但更重要的是,你不应该在循环中首先这样做,每一个函数(stackvstackappend)都重新创建一个新的数组。
将所有的np.array(preprocess(f))b = np.array(app)添加到一个纯python列表中,并且只在读取完它们之后才调用stackvstack,这可能会更有效。
或者,更好的方法是直接将preprocess(f)app追加到python list中,然后在循环结束后调用np.array
所以,就像

la=[]
lb=[]
for f in csv_files:
    cnt +=1
    seperator = '_'
    app = os.path.basename(f).split(seperator, 1)[0]

    la.append(preprocess(f))
    lb.append(app)
a=np.array(la)
b=np.array(lb)
oipij1gg

oipij1gg2#

创建一个新列表,并在阅读后将每个列表添加到新列表中。(在循环外创建新列表)

4szc88ey

4szc88ey3#

您必须从vstack更改为stack

la=[]
lb=[]
for f in csv_files:
    cnt +=1
    seperator = '_'
    app = os.path.basename(f).split(seperator, 1)[0]

    la.append(preprocess(f))
    lb.append(app)
a=np.stack(la, axis=0)
b=np.array(lb)

vstack只能沿着行堆叠,但stack函数可以沿新轴堆叠。

相关问题