定义Numpy数组并以单行分配值

Lio*_*gen 2 python arrays numpy

有没有办法做到以下几点

import numpy as np
x = np.arange(10)
x[2:7] = 1
Run Code Online (Sandbox Code Playgroud)

一行?就像是

x = np.arange(10)[2:7] = 1
Run Code Online (Sandbox Code Playgroud)

Div*_*kar 6

使用一衬maskingnp.in1dnp.where分配的价值观-

np.where(np.in1d(range(10),range(2,7)), 1, range(10))
Run Code Online (Sandbox Code Playgroud)

样品运行 -

In [28]: np.where(np.in1d(range(10),range(2,7)), 1, range(10))
Out[28]: array([0, 1, 1, 1, 1, 1, 1, 7, 8, 9])
Run Code Online (Sandbox Code Playgroud)

一步一步的运行 -

获取要分配新值的掩码:

In [44]: np.in1d(range(10),range(2,7))
Out[44]: array([False, False,  True,  True,  True,  True,  \
                True, False, False, False], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

使用mask随之np.where在新值(=1)和最初定义的值之间进行选择- range(10):

In [45]: np.where(np.in1d(range(10),range(2,7)), 1, range(10))
Out[45]: array([0, 1, 1, 1, 1, 1, 1, 7, 8, 9])
Run Code Online (Sandbox Code Playgroud)

因此,总而言之,语法基本上是 -

np.where(np.in1d(range(10),range(2,7)), 1, range(10))
                        ^         ^     ^       ^
                       (1)       (2)   (3)  <--(4)-->   
Run Code Online (Sandbox Code Playgroud)

(1)要定义的数组长度.

(2)切片限制.

(3)作为第二步分配的新值.

(4)在定义数组时初始化为数组的值.

这是另一个示例用法 -

In [41]: np.where(np.in1d(range(9),range(2,7)), 99, range(10,19))
Out[41]: array([10, 11, 99, 99, 99, 99, 99, 17, 18])
Run Code Online (Sandbox Code Playgroud)

重现它的原始样式代码将是 -

x = np.arange(10,19)
x[2:7] = 99
Run Code Online (Sandbox Code Playgroud)

  • 虽然这在功能上是一个很好的答案,但我认为这个内胆比原来的两线版本更不易读.因此,除非以这种方式改进性能(内存或速度),否则我认为双线方法是首选.或者至少确保充分评论一个班轮. (3认同)