Cela semble être une question très simple, mais je ne trouve nulle part une bonne réponse. Comment puis-je multiplier (en place) les colonnes de sélection (peut-être sélectionnées par une liste) par un scalaire en utilisant numpy?

Par exemple. Multipliez les colonnes 0 et 2 par 4

In:  arr=([(1,2,3,5,6,7), (4,5,6,2,5,3), (7,8,9,2,5,9)])
Out: arr=([(4,2,12,5,6,7), (16,5,24,2,5,3), (28,8,36,2,5,9)])

Actuellement, je fais cela en plusieurs étapes, mais je pense qu'il doit y avoir un meilleur moyen, surtout si la liste s'allonge. Voie actuelle:

arr['f0'] *= 4
arr['f2'] *= 4
1
Matt Stokes 14 juil. 2015 à 04:37

3 réponses

Meilleure réponse

Vous pouvez utiliser le découpage de tableau comme suit pour cela -

In [10]: arr=([(1,2,3,5,6,7), (4,5,6,2,5,3), (7,8,9,2,5,9)])

In [11]: narr = np.array(arr)

In [13]: narr[:,(0,2)] = narr[:,(0,2)]*4

In [14]: narr
Out[14]:
array([[ 4,  2, 12,  5,  6,  7],
       [16,  5, 24,  2,  5,  3],
       [28,  8, 36,  2,  5,  9]])
3
Anand S Kumar 14 juil. 2015 à 02:02

Une autre solution consiste à créer une classe qui hérite de np.ndarray et à lui ajouter une méthode pour rendre la mutation sur place plus intuitive.

Code:

import numpy as np

class A(np.ndarray):

    def __new__(cls, a):
        arr = np.asarray(a)
        arr = arr.view(cls)
        return arr

    def mutate(self, col, k):
        self[:,col] *= k
        return self

a = A([(1,2,3,5,6,7), (4,5,6,2,5,3), (7,8,9,2,5,9)])
print a
print '---------------------'

a.mutate(0, 4)
a.mutate(2, 4)

print a

Résultat:

[[1 2 3 5 6 7]
 [4 5 6 2 5 3]
 [7 8 9 2 5 9]]
---------------------
[[ 4  2 12  5  6  7]
 [16  5 24  2  5  3]
 [28  8 36  2  5  9]]
0
Jerome Montino 14 juil. 2015 à 06:46

Vous pouvez utiliser ce qui suit avec le découpage de tableau

arr=([(1,2,3,5,6,7), (4,5,6,2,5,3), (7,8,9,2,5,9)])

array = np.array(arr)

array[:,(0,2)]*=4

array
Out[10]: 
array([[ 4,  2, 12,  5,  6,  7],
       [16,  5, 24,  2,  5,  3],
       [28,  8, 36,  2,  5,  9]])
0
Aurum 16 oct. 2018 à 13:20