有没有办法做到以下
import numpy as np
x = np.arange(10)
x[2:7] = 1
单行?像
这样的东西x = np.arange(10)[2:7] = 1
答案 0 :(得分:6)
单行使用masking
np.in1d
和np.where
分配值 -
np.where(np.in1d(range(10),range(2,7)), 1, range(10))
示例运行 -
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])
分步运行 -
获取要分配新值的掩码:
In [44]: np.in1d(range(10),range(2,7))
Out[44]: array([False, False, True, True, True, True, \
True, False, False, False], dtype=bool)
使用掩码和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])
因此,总而言之,语法基本上是 -
np.where(np.in1d(range(10),range(2,7)), 1, range(10))
^ ^ ^ ^
(1) (2) (3) <--(4)-->
(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])
重现它的原始样式代码是 -
x = np.arange(10,19)
x[2:7] = 99
答案 1 :(得分:1)
虽然Divakar的回答能够胜任,但它的可读性并不好。使用numpy.r_
执行此操作的方式更为坎坷 - 这实际上是执行连接,但您可以使用切片指定数组。
从文档中的示例(稍微修改一下):
>>> np.r_[1:4, 0, 0, 4:7]
array([1, 2, 3, 0, 0, 4, 5, 6])
>>> np.r_[-1:1:6j, [0]*3, 5, 6]
array([-1. , -0.6, -0.2, 0.2, 0.6, 1. , 0. , 0. , 0. , 5. , 6. ])
对于您的具体示例,
>>> np.r_[0:2, [1,]*5, 7:10]
array([0, 1, 1, 1, 1, 1, 1, 7, 8, 9])
答案 2 :(得分:0)
您可以使用np.hstack:
np.hstack((np.arange(2), np.ones(7-2), np.arange(7,10)))
并将np.ones
乘以您需要的数字。应该可以直接将其扩展到任意输入数字。