pandas 用多个形状2的数组填充形状3的数组

tjjdgumg  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(110)

我需要你帮我把这个问题的标题写得更好。
但我实际上有一个由2d数组组成的数组框架,(即每一行是名为ab[y][x]的2D图像其中x,y是整数).我试图创建一个数组与形状(number of rows in data frame, len(x), len(y))通过使用每个二维数组中的点阵. len(x)也可以被认为是在每个二维数组的行数和len(y)可以被认为是在每个二维列数数组。我将在下面包含一个MRE:

import numpy as np 
import pandas as pd

data = {"ab[0][0]": [329, 392, 9294, 4922, 9324, 95839],
        "ab[0][1]": [23, 27, 3299, 827, 60, 47],
        "ab[0][2]": [80, 32, 50, 782, 934, 93],
        "ab[0][3]": [90, 100, 53, 438, 50, 53], 
        "ab[1][0]": [6000, 245, 24, 204, 2390, 7248],
        "ab[1][1]": [23, 5324, 13, 45, 60, 435],
        "ab[1][2]": [4253, 53, 5035, 75, 82, 8347],
        "ab[1][3]": [843, 9403, 70, 434, 50, 828],
        "ab[2][0]": [600, 5000, 10342, 3453, 3553, 9834],
        "ab[2][1]": [23, 27, 13, 45, 8493, 70],
        "ab[2][2]": [4983, 4872, 28, 75, 60, 843],
        "ab[2][3]": [48739, 2389, 3478, 827, 932, 83], 
}

ab_df = pd.DataFrame(data)
ab_values = []

for i in range(ab_df.shape[0]):
  individual_ab = []
  for j in range(3): # can think of 3 as the x-values on an x-y graph (or 3 columns)
    ab_columns = [col for col in ab_df.columns if f'ab[{j}]' in col]
    individual_ab.append(ab_df.iloc[[i]][ab_columns].T.values)
    
  if len (individual_ab) > 0: # so I don't add an empty list to the end of the array
    ab_values.append(np.hstack(individual_ab))
      
ab_arr = np.stack(ab_values) # should have (6, 4, 3)

字符串
我的解决方案实际上使用了三个for循环,当处理1000多行的嵌套框时,速度非常慢。
我的主要问题是,有没有更好的方法来做到这一点,也许是通过使用一些numpy或pandas函数或更好的算法?
我的另一个问题是,对于x轴的长度(即for j in range(3)),是否有一种方法可以使用数据自动计算出来,现在我正在手动编码3,就像上面的例子一样,但是假设数据发生了变化,我需要一种方法来自动更改该值。我一直在试图找出解决方案,但我就是不能解决这个问题。

flvlnr44

flvlnr441#

IIUC,您可以直接reshapeDataFrame

N = 3 # or maybe N = ab_df.shape[0] // 2 ?

ab_arr = np.reshape(ab_df, (-1, ab_df.shape[1]//N, N), order="F")

字符串
输出量:

array([[[  329,  6000,   600],
        [   23,    23,    23],
        [   80,  4253,  4983],
        [   90,   843, 48739]],

       [[  392,   245,  5000],
        [   27,  5324,    27],
        [   32,    53,  4872],
        [  100,  9403,  2389]],

       [[ 9294,    24, 10342],
        [ 3299,    13,    13],
        [   50,  5035,    28],
        [   53,    70,  3478]],

       [[ 4922,   204,  3453],
        [  827,    45,    45],
        [  782,    75,    75],
        [  438,   434,   827]],

       [[ 9324,  2390,  3553],
        [   60,    60,  8493],
        [  934,    82,    60],
        [   50,    50,   932]],

       [[95839,  7248,  9834],
        [   47,   435,    70],
        [   93,  8347,   843],
        [   53,   828,    83]]])

mcdcgff0

mcdcgff02#

关于data

In [108]: data
Out[108]: 
{'ab[0][0]': [329, 392, 9294, 4922, 9324, 95839],
 'ab[0][1]': [23, 27, 3299, 827, 60, 47],
 'ab[0][2]': [80, 32, 50, 782, 934, 93],
 'ab[0][3]': [90, 100, 53, 438, 50, 53],
 'ab[1][0]': [6000, 245, 24, 204, 2390, 7248],
 'ab[1][1]': [23, 5324, 13, 45, 60, 435],
 'ab[1][2]': [4253, 53, 5035, 75, 82, 8347],
 'ab[1][3]': [843, 9403, 70, 434, 50, 828],
 'ab[2][0]': [600, 5000, 10342, 3453, 3553, 9834],
 'ab[2][1]': [23, 27, 13, 45, 8493, 70],
 'ab[2][2]': [4983, 4872, 28, 75, 60, 843],
 'ab[2][3]': [48739, 2389, 3478, 827, 932, 83]}

字符串
框架是:

In [109]: ab_df
Out[109]: 
   ab[0][0]  ab[0][1]  ab[0][2]  ab[0][3]  ab[1][0]  ab[1][1]  ab[1][2]  \
0       329        23        80        90      6000        23      4253   
1       392        27        32       100       245      5324        53   
2      9294      3299        50        53        24        13      5035   
3      4922       827       782       438       204        45        75   
4      9324        60       934        50      2390        60        82   
5     95839        47        93        53      7248       435      8347   

   ab[1][3]  ab[2][0]  ab[2][1]  ab[2][2]  ab[2][3]  
0       843       600        23      4983     48739  
1      9403      5000        27      4872      2389  
2        70     10342        13        28      3478  
3       434      3453        45        75       827  
4        50      3553      8493        60       932  
5       828      9834        70       843        83


从那里你可以很容易地得到一个数组,每一行一个帧,每一列:

In [111]: arr = ab_df.to_numpy()

In [112]: arr
Out[112]: 
array([[  329,    23,    80,    90,  6000,    23,  4253,   843,   600,
           23,  4983, 48739],
       [  392,    27,    32,   100,   245,  5324,    53,  9403,  5000,
           27,  4872,  2389],
       [ 9294,  3299,    50,    53,    24,    13,  5035,    70, 10342,
           13,    28,  3478],
       [ 4922,   827,   782,   438,   204,    45,    75,   434,  3453,
           45,    75,   827],
       [ 9324,    60,   934,    50,  2390,    60,    82,    50,  3553,
         8493,    60,   932],
       [95839,    47,    93,    53,  7248,   435,  8347,   828,  9834,
           70,   843,    83]], dtype=int64)

In [113]: arr.shape
Out[113]: (6, 12)


很容易重塑这样的数组,或者转置它,等等。

In [116]: arr.reshape(3,4,-1)
Out[116]: 
array([[[  329,    23,    80,    90,  6000,    23],
        [ 4253,   843,   600,    23,  4983, 48739],
        [  392,    27,    32,   100,   245,  5324],
        [   53,  9403,  5000,    27,  4872,  2389]],

       [[ 9294,  3299,    50,    53,    24,    13],
        [ 5035,    70, 10342,    13,    28,  3478],
        [ 4922,   827,   782,   438,   204,    45],
        [   75,   434,  3453,    45,    75,   827]],

       [[ 9324,    60,   934,    50,  2390,    60],
        [   82,    50,  3553,  8493,    60,   932],
        [95839,    47,    93,    53,  7248,   435],
        [ 8347,   828,  9834,    70,   843,    83]]], dtype=int64)


或者你想

In [120]: arr.T.reshape(3,4,6)
Out[120]: 
array([[[  329,   392,  9294,  4922,  9324, 95839],
        [   23,    27,  3299,   827,    60,    47],
        [   80,    32,    50,   782,   934,    93],
        [   90,   100,    53,   438,    50,    53]],

       [[ 6000,   245,    24,   204,  2390,  7248],
        [   23,  5324,    13,    45,    60,   435],
        [ 4253,    53,  5035,    75,    82,  8347],
        [  843,  9403,    70,   434,    50,   828]],

       [[  600,  5000, 10342,  3453,  3553,  9834],
        [   23,    27,    13,    45,  8493,    70],
        [ 4983,  4872,    28,    75,    60,   843],
        [48739,  2389,  3478,   827,   932,    83]]], dtype=int64)

相关问题