3

is it possible to get values from numpy array based on list of indexes like i.e 1 and 3? Then, I want to put another values instead of them.

Here is example:

import numpy as np

array = np.array([0, 1, 2, 8, 4, 9, 1, 2])
idx = [3, 5]

So I want to replace X[3] = 8 and X[5] = 9 with another values but I do not want to this in a loop because I could have large array. Is it a way or maybe a function to do operations like this but not in a loop?

BS98
  • 101
  • 3
  • 6

2 Answers2

3

You should use array[idx] = new_values. This approach is much faster than native python loops. But you will have to convert 'idx' and 'new_values' to numpy arrays as well.

import numpy as np

n = 100000
array = np.random.random(n)
idx = np.random.randint(0, n, n//10)
new_values = np.random.random(n//10)
%time array[idx] = new_values

Wall time: 257 µs

def f():
    for i, v in zip(idx, new_values):
        array[i] = v
%time f()

Wall time: 5.93 ms

JST
  • 56
  • 2
1

Use np.r_:

larr = np.array([0, 1, 2, 8, 4, 9, 1, 2])
larr[np.r_[3, 5]]

Output

array([8, 9])

As @MadPhysicist suggest, using larr[np.array([3, 5])] will work also, and is faster.

Scott Boston
  • 147,308
  • 15
  • 139
  • 187