代码之家  ›  专栏  ›  技术社区  ›  Mauro Gentile

多维np数组的列表序列

  •  2
  • Mauro Gentile  · 技术社区  · 6 年前

    我有一个熊猫数据框。 一列是数字(作为字符)除以空格的字符串

    我需要把它转换成多维numpy数组。

    我想:

    df.A.apply(lambda x: np.array(x.split(" "))).values
    

    会成功的

    实际上它返回一个数组。。。。

    array([array(['70', '80', '82', ..., '106', '109', '82'], dtype='<U3'),
       array(['151', '150', '147', ..., '193', '183', '184'], dtype='<U3'),
    

    我看起来不像是我在找的东西

    array([[[['70', '80', '82', ..., '106', '109', '82'],['151', '150', '147', ..., '193', '183', '184']....
    

    第二:我对这两种数据结构之间的区别有点困惑。归根结底,多维数组就是数组的数组。从这个角度看,这两个似乎是相同的结构。但我肯定我错过了一些东西

    例子:

    df=pd.DataFrame({"A":[0,1,2,3],"B":["1 2 3 4","5 6 7 8","9 10 11 12","13 14 15 16"]})
    
        A   B
    0   0   "1 2 3 4"
    1   1   "5 6 7 8"
    2   2   "9 10 11 12"
    3   3   "13 14 15 16"
    

    这个命令

    df.B.apply(lambda x: np.array(x.split(" "))).values
    

    给予:

    array([array(['1', '2', '3', '4'], dtype='<U1'),
       array(['5', '6', '7', '8'], dtype='<U1'),
       array(['9', '10', '11', '12'], dtype='<U2'),
       array(['13', '14', '15', '16'], dtype='<U2')], dtype=object)
    

     array([['1', '2', '3', '4'],
       ['5', '6', '7', '8'],
       ['9', '10', '11', '12'],
       ['13', '14', '15', '16']], dtype='<U2')
    

    问题1:我如何得到最后一个结构? 问题2:两者有什么区别?从技术上讲,这两个阵列都是。。。

    1 回复  |  直到 6 年前
        1
  •  3
  •   Ben.T    6 年前

    你可以用 str.split df.A 直接,用参数 expand=True 然后使用 values 例如:

    df = pd.DataFrame({'A':['70 80 82','151 150 147']})
    print (df.A.str.split(' ',expand=True).values)
    array([['70', '80', '82'],
           ['151', '150', '147']], dtype=object)
    

    使用您的方法,如果所有字符串都包含相同数量的数字,则仍然可以使用 np.stack 要得到相同的结果:

    print (np.stack(df.A.apply(lambda x: np.array(x.split(" "))).values))
    

    编辑 :对于区别,我不确定我能解释得足够好,但我尽力了。让我们来定义

    arr1 = df.A.str.split(' ',expand=True).values
    arr2 = df.A.apply(lambda x: np.array(x.split(" "))).values
    

    首先,您可以注意到形状不同:

    print(arr1.shape)
    (2, 3)
    print(arr2.shape)
    (2,)
    

    arr2 是一个1D数组,其中的元素恰好也是1D数组。当你建造 具有 价值观 ,它从序列构造1D数组 df.A.apply(lambda x: np.array(x.split(" "))) 不看这个系列的字体。为了 arr1 ,区别在于 df.A.str.split(' ',expand=True) 价值观 将构造一个二维数组,其形状为 (number of rows,nb of columns) 价值观 ,但实际上在一个系列的单元格中有一个数组(如在方法中创建的那样)不会创建二维数组。

    然后,如果要访问任何元素(例如第一行第二个元素),可以通过 arr1[0,1] arr2[0,1] 将引发错误,因为此结构不是二维数组,但是 arr2[0][1] [1] 第一个1D数组的 [0] 在里面 arr2号

    我希望它能给出一些解释。