通过键阵列拆分numpy数组

时间:2016-01-18 13:09:43

标签: arrays numpy

我有一个看起来像这样的numpy数组:

+----+-------+----------------+
| id | class |  probability   |
+----+-------+----------------+
| 0  |   0   | 0.371301944865 |
| 0  |   1   | 0.317619162391 |
| 0  |   -1  | 0.311078922721 |
| 1  |   0   | 0.401434454687 |
| 1  |   1   | 0.316000976419 |
| 1  |   -1  | 0.282564557522 |
| 2  |   1   | 0.361490456577 |
| 2  |   0   | 0.324832048066 |
| 2  |   -1  | 0.313677512904 |
| .  |   .   | .              |
| .  |   .   | .              |
| .  |   .   | .              |
+----+-------+----------------+

或更正式:

x = numpy.array([[  0.00000000e+00,   0.00000000e+00,   3.71301945e-01],
       [  0.00000000e+00,   1.00000000e+00,   3.17619162e-01],
       [  0.00000000e+00,  -1.00000000e+00,   3.11078923e-01],
       [  1.00000000e+00,   0.00000000e+00,   4.01434455e-01],
       [  1.00000000e+00,   1.00000000e+00,   3.16000976e-01],
       [  1.00000000e+00,  -1.00000000e+00,   2.82564558e-01],
       [  2.00000000e+00,   1.00000000e+00,   3.61490457e-01],
       [  2.00000000e+00,   0.00000000e+00,   3.24832048e-01],
       [  2.00000000e+00,  -1.00000000e+00,   3.13677513e-01]])

正如您所看到的,对于每个id,我有三个类,每个类都有其概率。我想将其转换为这样的四列数组:

id/class         -1                0                1
0                0.311078922721    0.371301944865   0.317619162391
1                0.282564557522    0.401434454687   0.316000976419
.                .                 .                .
.                .                 .                .
.                .                 .                .

有快速/干净的方法吗?!

3 个答案:

答案 0 :(得分:3)

以下是pandas的解决方案:

class        -1         0         1
id                                 
0      0.311079  0.371302  0.317619
1      0.282565  0.401434  0.316001
2      0.313678  0.324832  0.361490

输出:

<MenuItem Header="My Items" ItemsSource="{Binding Path=MyMenuItems}" Click="MenuItem_Click">
    <MenuItem.ItemContainerStyle>
        <Style TargetType="MenuItem">
            <Setter Property="CommandParameter" Value="{Binding}" />
        </Style>
    </MenuItem.ItemContainerStyle>
</MenuItem>

答案 1 :(得分:1)

将id与数据连接起来:np.hstack((a[:,0][::3][:,None],a[:,2].reshape(-1,3)))

例如:

a=np.array([[i//3,i%3-1,np.random.random()] for i in range (15)])
# a=a[np.argsort(a[:,1])][np.argsort(a[:,0])] #if not sorted
print(a)
id=a[::3,0][:,None]
data =a[:,2].reshape(-1,3)
print(np.hstack((id,data))) 

给出

[[ 0.         -1.          0.78556868]
 [ 0.          0.          0.29483601]
 [ 0.          1.          0.74003482]
 [ 1.         -1.          0.00673232]
 [ 1.          0.          0.43262104]
 [ 1.          1.          0.92925208]
 [ 2.         -1.          0.26060377]
 [ 2.          0.          0.21186242]
 [ 2.          1.          0.88388227]
 [ 3.         -1.          0.53816376]
 [ 3.          0.          0.82545746]
 [ 3.          1.          0.53964188]
 [ 4.         -1.          0.63082784]
 [ 4.          0.          0.45693351]
 [ 4.          1.          0.38970428]]

[[ 0.          0.78556868  0.29483601  0.74003482]
 [ 1.          0.00673232  0.43262104  0.92925208]
 [ 2.          0.26060377  0.21186242  0.88388227]
 [ 3.          0.53816376  0.82545746  0.53964188]
 [ 4.          0.63082784  0.45693351  0.38970428]]
pandas也可以为你提供很好的解决方案。

答案 2 :(得分:0)

您还可以使用pandas

中的unstack

使用相同的df @HYRY,添加:

df.set_index(["id","class"]).unstack("class").reset_index()

结果:

      id         p                    
class         -1.0       0.0       1.0
0      0  0.311079  0.371302  0.317619
1      1  0.282565  0.401434  0.316001
2      2  0.313678  0.324832  0.361490