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

时间:2017-01-04 11:59:55

标签: python arrays numpy

有没有办法做到以下

import numpy as np
x = np.arange(10)
x[2:7] = 1

单行?像

这样的东西
x = np.arange(10)[2:7] = 1

3 个答案:

答案 0 :(得分:6)

单行使用masking np.in1dnp.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乘以您需要的数字。应该可以直接将其扩展到任意输入数字。

enter image description here