atribuirea valorii dependente de index pentru fiecare index din matricea numita

I want to center multi-dimensional data in a n x m matrix (), let's say X . I defined a new array ones(645), lets say centVector to produce the mean for every row in matrix X. And now I want to iterate every row in X, compute the mean and assign this value to the corresponding index in centVector. Isn't this possible in a single row in scipy/numpy? I am not used to this language and think about something like:

centVector = ones(645)
for key, val in X:
    centVector[key] = centVector[key] * (val.sum/val.size)

După aceea, trebuie să scot doar media în fiecare rând:

X = X - centVector

Cum pot simplifica acest lucru? EDIT: Și, în plus, codul de mai sus nu funcționează - pentru o buclă cheie-valoare am nevoie de ceva ca enumerate (X) . Și nu sunt sigur dacă X-centVector returnează soluția potrivită.

0

1 răspunsuri

În primul rând, câteva exemple de date:

>>> import numpy as np
>>> X = np.matrix(np.arange(25).reshape((5,5)))
>>> print X
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [20 21 22 23 24]]

numpy convenabil are o funcție mean . În mod prestabilit, vă va oferi media peste toate valorile din matrice. Deoarece doriți mediul fiecărui rând, trebuie să specificați axa a operației:

>>> np.mean(X, axis=1)
matrix([[  2.],
        [  7.],
        [ 12.],
        [ 17.],
        [ 22.]])

Rețineți că axis = 1 spune: găsiți mijlocul lungimea coloanele (pentru fiecare rând), unde 0 = rânduri și 1 = coloane (și așa mai departe). Acum, puteți scădea această medie din X , așa cum ați făcut inițial.

Sfaturi nesolicitate

De obicei, este recomandat să evitați clasa de matrice ( vedeți docs ). Dacă eliminați apelul np.matrix din datele de exemplu, atunci obțineți o matrice normală numpy.

Din păcate, în acest caz special, folosirea unei matrice complică lucrurile ușor deoarece np.mean va returna o matrice 1D:

>>> X = np.arange(25).reshape((5,5))
>>> r_means = np.mean(X, axis=1)
>>> print r_means
[  2.   7.  12.  17.  22.]

Dacă încercați să scăpați acest lucru de X , r_means devine transmis la un vector de rând, în loc de un vector de coloană:

>>> X - r_means
array([[ -2.,  -6., -10., -14., -18.],
       [  3.,  -1.,  -5.,  -9., -13.],
       [  8.,   4.,   0.,  -4.,  -8.],
       [ 13.,   9.,   5.,   1.,  -3.],
       [ 18.,  14.,  10.,   6.,   2.]])

Deci, va trebui să remodelați matricea 1D într-un vector de coloană N x 1 :

>>> X - r_means.reshape((-1, 1))
array([[-2., -1.,  0.,  1.,  2.],
       [-2., -1.,  0.,  1.,  2.],
       [-2., -1.,  0.,  1.,  2.],
       [-2., -1.,  0.,  1.,  2.],
       [-2., -1.,  0.,  1.,  2.]])

Codul -1 trecut la reshape spune numpy pentru a determina această dimensiune pe baza formei originale a matricei și a celorlalte dimensiuni ale noului matrice. În mod alternativ, ați fi putut fi remodelat matricele utilizând r_means [:, np.newaxis] .

0
adăugat
Python România
Python România
100 participanți

Comunitatea pasionaților de Python din România.