Python 如何使用numpy在一行中创建大小为10但第五个值为1的空向量

Python 如何使用numpy在一行中创建大小为10但第五个值为1的空向量,python,numpy,Python,Numpy,对于numpy模块,我可以用两行代码来完成: x=np.zeros(10) x[4]=1 然而,我想知道是否有可能将两者结合在一起 x = numpy.array([0,0,0,0,1,0,0,0,0,0]) :p有多种方法可以做到这一点。例如,np.arange(10)=4为您提供一个包含所有False值的数组,除了位置4处的一个True 在封面下,NumPy的bool值只是0和1作为uint8(就像Python的bool值是0和1,尽管是唯一的整数类型),因此您可以在任何表达式中使用它:

对于numpy模块,我可以用两行代码来完成:

x=np.zeros(10)
x[4]=1
然而,我想知道是否有可能将两者结合在一起

x = numpy.array([0,0,0,0,1,0,0,0,0,0])

:p

有多种方法可以做到这一点。例如,
np.arange(10)=4
为您提供一个包含所有
False
值的数组,除了位置4处的一个
True

在封面下,NumPy的
bool
值只是
0
1
作为
uint8
(就像Python的
bool
值是
0
1
,尽管是唯一的整数类型),因此您可以在任何表达式中使用它:

>>> np.arange(10) == 4
array([False, False, False, False,  True, False, False, False, False, False], dtype=bool)
>>> np.arange(10) * 1
array([0, 0, 0, 0, 1, 0, 0, 0, 0, 0])
>>> np.arange(10) + 23
array([23, 23, 23, 23, 24, 23, 23, 23, 23, 23])
…或
将其视为
uint8
而不是
bool

>>> (np.arange(10) == 4).view(np.uint8)
array([0, 0, 0, 0, 1, 0, 0, 0, 0, 0], dtype=uint8)
…或者,如果需要正常的
int
值,可以将其转换为:

>>> (np.arange(10) == 4).astype(int)
数组([0,0,0,0,1,0,0,0,0,0,0])

等等


但是,这看起来可读性要差得多,而且在快速测试中也要慢20%左右,因此,除非您是出于代码高尔夫的原因而这样做,否则为什么呢?

我不认为可以结合:

x=np.zeros(10) #1 create an array of values 
x[4]=1         #2 assign at least one value of an array a different value
排成一行

天真的:

x = np.zeros(10)[4] = 1 # Fails
由于python处理链式赋值的方式,
x
的值为
1
,因此失败。零数组中的
x
元素4
都被赋值
1


因此,我们需要首先创建一个零数组,然后为元素赋值
元素4
一个
1
的值,这两个值不能在一行中完成

如果需要对多个元素执行此操作:

my_vect = np.zeros(42)
# set index 1 and 3 to value 1
my_vect[np.array([1,3])] = 1
因此,创建一个大小为10的空向量,但第五个值为一行中的1是

array = numpy.eye( 10 ) [ 5 - 1 ]
==>数组([0,0,0,0,1,0,0,0,0,0,0.]))


:)

为什么要在一行中执行此操作?几乎可以肯定的是,它的可读性和速度会降低…@abarnert没有理由,只是想通过这样做来学习你可以做到:
x=np.zeros(10);x[4]=1
,这当然是作弊。那是作弊,你不能把所有的东西都打出来,因为可读性差,但是学习python中不同的句子结构很好。谢谢<代码>(np.arange(10)==4)。aType(int)
更快。而
(np.arange(10)==4)。view(np.uint8)
可能更快。@WarrenWeckesser:我得到的是5.44us对5.49us,所以……不是那么多,至少对于这个小盒子来说是这样。当然(4.28us对5.48us),但是这些不是
int
值,它们只是可以与
int
值一起使用的值,而
bool
已经是了。不过,当然也很方便,比如说,向人类打印,所以同样,+1和编辑。
array = numpy.eye( 10 ) [ 5 - 1 ]
b=np.array([int(x==4) for x in range(10)])
print(b)


[0 0 0 0 1 0 0 0 0 0]