展平numpy数组并保留索引值



假设我有以下矩阵,pandasnumpy:

A = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])

我正在寻找一种方法,将这个数组重塑为1D,并将该单元格的索引保留为列名,这样,如果将上面的内容压平,结果将是这样的:

>>> array([['i1j1', 'i1j2', 'i1j3', 'i2j1', 'i2j2', 'i2j3', 'i3j1', 'i3j2','i3j3'],
['1', '2', '3', '4', '5', '6', '7', '8', '9']], dtype='<U4')

非常感谢。

尝试:

df = pd.DataFrame(A, 
columns=[f'j{j+1}' for j in range(A.shape[1])], 
index=[f'i{i+1}' for i in range(A.shape[0])]).stack()
df.index = [f'{i}{j}' for i, j in df.index]
df_out = df.to_frame().T
df_out

输出:

i1j1  i1j2  i1j3  i2j1  i2j2  i2j3  i3j1  i3j2  i3j3
0     1     2     3     4     5     6     7     8     9

这里有另一种方法:

b = (pd.DataFrame(A)
.rename(lambda x: 'i{}'.format(x+1))
.rename(lambda x: 'j{}'.format(x+1),axis=1)
.stack())
b = b.set_axis(b.index.map(''.join)).to_frame().T
正如您所注意到的,有一种非常直观的方法可以计算扁平数组的索引。我们可以使用np.meshgrid来利用这一点。
xv, yv = np.meshgrid(np.arange(A.shape[0]), np.arange(A.shape[1])) 
indices = np.stack(( yv.flatten(), xv.flatten()), axis=1)

输出

array([[0, 0],
[0, 1],
[0, 2],
[1, 0],
[1, 1],
[1, 2],
[2, 0],
[2, 1],
[2, 2]])

编辑:

要获得示例中的确切格式,请尝试:

xv, yv = np.meshgrid(np.arange(A.shape[0]) + 1, np.arange(A.shape[1]) + 1)  
rows = np.char.add('i', yv.flatten().astype(str)) 
cols = np.char.add('j', xv.flatten().astype(str))
indicies = np.char.add(rows,cols)
np.stack((indicies, A.flatten()))

返回

array([['i1j1', 'i1j2', 'i1j3', 'i2j1', 'i2j2', 'i2j3', 'i3j1', 'i3j2', 'i3j3'],
['1', '2', '3', '4', '5', '6', '7', '8', '9']], dtype='<U24')

最新更新