एक उदाहरण के रूप में नीचे दिए गए सरणी a का उपयोग करते हुए, मैं z Score तीसरे कॉलम में प्रत्येक मान के लिए अलग से a[:,2]

In [52]: import numpy as np; from scipy import stats

In [53]: a = np.array([[0., 0., 0., 1., 2.], [ 0.,  0.,  1.,  3.,  4.], [ 1.,  0.,
    ...:   0.,  5.,  6.], [1.,  0.,  1.,  7.,  8.], [ 2.,  0., 0.,  9.,  6.], [2.,
    ...:   0.,  1.,  8.,  9.], [ 3.,  np.NaN,  np.NaN,  np.NaN,  np.NaN]])

In [54]: a
Out[54]:
array([[ 0.,  0.,  0.,  1.,  2.],
       [ 0.,  0.,  1.,  3.,  4.],
       [ 1.,  0.,  0.,  5.,  6.],
       [ 1.,  0.,  1.,  7.,  8.],
       [ 2.,  0.,  0.,  9.,  6.],
       [ 2.,  0.,  1.,  8.,  9.],
       [ 3., nan, nan, nan, nan]])

उस मामले के लिए जहां तीसरा कॉलम 0 a[:,2] == 0 है, मैं इसकी गणना कर सकता हूं

In [48]: np.fromfunction(lambda i, j: stats.zscore(a[a[:,2] == 0][:,3:]), (1, 1))
Out[48]:
array([[-1.22474487, -1.41421356],
       [ 0.        ,  0.70710678],
       [ 1.22474487,  0.70710678]])

और उस मामले के लिए जहां तीसरा कॉलम 1 a[:,2] == 1 है, मैं इसकी गणना कर सकता हूं

In [49]: np.fromfunction(lambda i, j: stats.zscore(a[a[:,2] == 1][:,3:]), (1, 1))
Out[49]:
array([[-1.38873015, -1.38873015],
       [ 0.46291005,  0.46291005],
       [ 0.9258201 ,  0.9258201 ]])

मैं इन परिणामों के साथ अपने मूल सरणी को कैसे बढ़ा सकता हूं, तीसरे कॉलम में पंक्तियों और मानों की संख्या की परवाह किए बिना, निम्न की तरह कुछ बनाने के लिए -

Out[62]:
array([[ 0.        ,  0.        ,  0.        ,  1.        ,  2.        ,
        -1.22474487, -1.41421356],
       [ 0.        ,  0.        ,  1.        ,  3.        ,  4.        ,
        -1.38873015, -1.38873015],
       [ 1.        ,  0.        ,  0.        ,  5.        ,  6.        ,
         0.        ,  0.70710678],
       [ 1.        ,  0.        ,  1.        ,  7.        ,  8.        ,
         0.46291005,  0.46291005],
       [ 2.        ,  0.        ,  0.        ,  9.        ,  6.        ,
         1.22474487,  0.70710678],
       [ 2.        ,  0.        ,  1.        ,  8.        ,  9.        ,
         0.9258201 ,  0.9258201 ],
       [ 3.        ,         nan,         nan,         nan,         nan,
                nan,         nan]])
0
user2309803 31 मार्च 2020, 12:52

1 उत्तर

सबसे बढ़िया उत्तर

आपको समान संख्या में कॉलम a के साथ एक सरणी बनाने और उन्हें संयोजित करने के लिए np.column_stack का उपयोग करने की आवश्यकता है

z1 = np.fromfunction(lambda i, j: stats.zscore(a[a[:,2] == 0][:,3:]), (1, 1))
z2 = np.fromfunction(lambda i, j: stats.zscore(a[a[:,2] == 1][:,3:]), (1, 1))
z=np.zeros((a.shape[0],z1.shape[1]))*np.nan
z[::2][:z1.shape[0]]=z1
z[1::2][:z2.shape[0]]=z2
arr1 = np.column_stack((a,z))
arr1
array([[ 0.        ,  0.        ,  0.        ,  1.        ,  2.        ,
        -1.22474487, -1.41421356],
       [ 0.        ,  0.        ,  1.        ,  3.        ,  4.        ,
        -1.38873015, -1.38873015],
       [ 1.        ,  0.        ,  0.        ,  5.        ,  6.        ,
         0.        ,  0.70710678],
       [ 1.        ,  0.        ,  1.        ,  7.        ,  8.        ,
         0.46291005,  0.46291005],
       [ 2.        ,  0.        ,  0.        ,  9.        ,  6.        ,
         1.22474487,  0.70710678],
       [ 2.        ,  0.        ,  1.        ,  8.        ,  9.        ,
         0.9258201 ,  0.9258201 ],
       [ 3.        ,         nan,         nan,         nan,         nan,
                nan,         nan]])

n में अद्वितीय मानों के लिए a[:,2]

N = np.unique(a[:,2])[~np.isnan(np.unique(a[:,2]))]
zTemp = [np.fromfunction(lambda i, j: stats.zscore(a[a[:,2] == k][:,3:]), (1, 1)) for k in N]
z=np.zeros((a.shape[0], zTemp[0].shape[1]))*np.nan
for i in range(len(zTemp)):
    z[i::2][:z1.shape[0]]=zTemp[i]
arr1 = np.column_stack((a,z))
1
Aly Hosny 31 मार्च 2020, 12:06