GVKun编程网logo

如何使用另一个Numpy数组设置多维Numpy数组的单个元素?(numpy 多维数组)

25

关于如何使用另一个Numpy数组设置多维Numpy数组的单个元素?和numpy多维数组的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于pythonnumpy数组的numpy数组、pytho

关于如何使用另一个Numpy数组设置多维Numpy数组的单个元素?numpy 多维数组的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于python numpy数组的numpy数组、python – 用另一个数组中的随机元素填充numpy数组、从numpy数组列表创建numpy数组的Python方法、从两个多维numpy数组复制到另一个具有不同形状的数组等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

如何使用另一个Numpy数组设置多维Numpy数组的单个元素?(numpy 多维数组)

如何使用另一个Numpy数组设置多维Numpy数组的单个元素?(numpy 多维数组)

如果我们有一个numpy数组,例如:

Array = np.zeros((2, 10, 10))

我们想要设置一个元素,另一个元素

indexes = np.array([0,0,0])

我们该怎么做?

Array[indexes] = 5

将数组的第一个维度的每个元素设置为5

答案1

小编典典

使用aas作为数据数组和idx索引数组,以便每一行对应于要在数据数组中设置的一个元素,您可以执行以下操作-

a[tuple(idx.T)] = 5

样品运行-

In [94]: a = np.zeros((2,2,3),dtype=int)In [95]: idx = np.array([[0,0,0],[1,1,0],[0,1,2]])In [96]: a[tuple(idx.T)] = 5In [97]: aOut[97]: array([[[5, 0, 0],        [0, 0, 5]],       [[0, 0, 0],        [5, 0, 0]]])In [98]: a[tuple(idx.T)] = [5,10,15] # or set different valuesIn [99]: aOut[99]: array([[[ 5,  0,  0],        [ 0,  0, 15]],       [[ 0,  0,  0],        [10,  0,  0]]])

或者,我们可以使用计算线性索引,np.ravel_multi_index然后使用进行赋值np.put,就像这样-

np.put(a,np.ravel_multi_index(idx.T,a.shape),5)

如果您要处理三维数组,我们可以对三维索引进行切片,然后分配具有另一种方法,如下所示:

a[idx[:,0],idx[:,1],idx[:,2]] = 5

如果只是需要设置的一个元素,请执行以下操作-

a[tuple(idx)] = 5

样品运行-

In [118]: a = np.zeros((2,2,3),dtype=int)In [119]: idx = np.array([0,0,0])In [120]: a[tuple(idx)] = 5In [121]: aOut[121]: array([[[5, 0, 0],        [0, 0, 0]],       [[0, 0, 0],        [0, 0, 0]]])

python numpy数组的numpy数组

python numpy数组的numpy数组

我在创建numpy数组的numpy数组时遇到问题。我将在一个循环中创建它:

a=np.array([])while(...):   ...   b= //a numpy array generated   a=np.append(a,b)   ...

所需结果:

[[1,5,3], [9,10,1], ..., [4,8,6]]

实际结果:

[1,5,3,9,10,1,... 4,8,6]

可能吗?我不知道数组的最终尺寸,因此无法使用固定尺寸对其进行初始化。

答案1

小编典典

永远不要numpy在循环中追加数组:与基本的Python相比,这是NumPy非常不擅长的一项操作。这是因为您要对每个数据进行完整复制append,这将花费您二次时间。

相反,只需将您的数组附加到Python列表中,并在最后进行转换即可;结果更简单,更快捷:

a = []while ...:    b = ... # NumPy array    a.append(b)a = np.asarray(a)

至于为什么您的代码不起作用:np.append根本不表现list.append出来。特别是,追加时不会创建新尺寸。您将必须创建具有二维的初始数组,然后附加一个显式的轴参数。

python – 用另一个数组中的随机元素填充numpy数组

python – 用另一个数组中的随机元素填充numpy数组

我不确定这是否可行但是这里有.假设我有一个数组:
array1 = [0,.1,.2,.3,.4,.5,.6,.7,.8,.9,1]

现在我想创建一个numpy 1D数组,由5个元素组成,这些元素是从array1中随机抽取的,条件是sum等于1.例如,类似于numpy数组,看起来像[.2,0.2,0.1,0.1].

>目前我使用随机模块和选择函数,如下所示:
range1 = np.array([choice(array1),choice(array1),choice(array1)])
然后检查range1以查看它是否符合标准;我想知道是否有更快的方式,类似的东西
randomArray = np.random.random()代替.
>如果我可以将这个数组存储在某个库中会更好,这样如果我尝试生成100个这样的数组,那就没有重复,但这不是必需的.

解决方法

如果你使用numpy 1.7.0你可以使用 numpy.random.choice
>>> import numpy as np
>>> array1 = np.array([0,1])
>>> np.random.choice(array1,5)
array([ 0.,0.,0.3,1.,0.3])
>>> np.random.choice(array1,5,replace=False)
array([ 0.6,0.8,0.4])

要获得总和等于1的5个元素,

>生成4个随机数.
>从1 – >中减去4个数字的总和. X
>如果x包含在array1中,则将其用作最终数字;或重复

>>> import numpy as np
>>> 
>>> def solve(arr,total,n):
...     while True:
...         xs = np.random.choice(arr,n-1)
...         remain = total - xs.sum()
...         if remain in arr:
...             return np.append(xs,remain)
... 
>>> array1 = np.array([0,1])
>>> print solve(array1,1,5)
[ 0.1  0.3  0.4  0.2  0. ]

另一个版本(假设给定的数组已排序):

EPS = 0.0000001
def solve(arr,n):
    while True:
        xs = np.random.choice(arr,n-1)
        t = xs.sum()
        i = arr.searchsorted(total - t)
        if abs(t + arr[i] - total) < EPS:
            return np.append(xs,arr[i])

从numpy数组列表创建numpy数组的Python方法

从numpy数组列表创建numpy数组的Python方法

我在循环中生成一维numpy数组的列表,然后将其转换为2d
numpy数组。如果我提前知道项目数,我会预先分配一个2d的numpy数组,但是我不知道,因此我将所有内容都放在了列表中。

模拟如下:

>>> list_of_arrays = map(lambda x: x*ones(2),range(5))
>>> list_of_arrays
[array([ 0.,0.]),array([ 1.,1.]),array([ 2.,2.]),array([ 3.,3.]),array([ 4.,4.])]
>>> arr = array(list_of_arrays)
>>> arr
array([[ 0.,0.],[ 1.,1.],[ 2.,2.],[ 3.,3.],[ 4.,4.]])

我的问题如下:

是否有一种更好的方法(性能上)来执行收集顺序数值数据(在我的情况下为numpy数组)的任务,而不是将它们放入列表中,然后从中制成numpy.array(我正在创建新的obj并复制数据)?经过良好测试的模块中是否有可用的“可扩展”矩阵数据结构?

我的2d矩阵的典型大小在100x10到​​5000x10浮动之间

编辑: 在此示例中,我正在使用地图,但是在我的实际应用程序中,我有一个for循环

从两个多维numpy数组复制到另一个具有不同形状的数组

从两个多维numpy数组复制到另一个具有不同形状的数组

您可以在repeat中使用axis。您也不需要预定义a。我也建议不要使用broadcast_to,因为它会返回只读视图,并且内存在元素之间共享:

a = np.repeat(b[:,None,:],20,1) #adds dimensions 1 and 2 and repeats 20 times along axis 1
a = np.repeat(a,3,2) #repeats 3 times along axis 2

小例子:

b = np.arange(2*3).reshape(2,3)
#[[0 1 2]
# [3 4 5]]
a = np.repeat(b[:,2,1) 
a = np.repeat(a,2) 
#shape(2,3)
[[[[0 1 2]
   [0 1 2]
   [0 1 2]]

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


 [[[3 4 5]
   [3 4 5]
   [3 4 5]]

  [[3 4 5]
   [3 4 5]
   [3 4 5]]]]
,

我们可以使用np.broadcast_to

如果您认为还可以--

np.broadcast_to(b[:,(100,3))

如果需要具有自己的存储空间的输出,只需附加.copy()

如果要节省内存并填充已经定义的数组,请a

a[:] = b[:,:]

请注意,我们可以跳过后面的:

时间:

In [20]: b = np.random.rand(100,3)

In [21]: %timeit np.broadcast_to(b[:,3))
5.93 µs ± 64.4 ns per loop (mean ± std. dev. of 7 runs,100000 loops each)

In [22]: %timeit np.broadcast_to(b[:,3)).copy()
11.4 µs ± 56.2 ns per loop (mean ± std. dev. of 7 runs,100000 loops each)

In [23]: %timeit np.repeat(np.repeat(b[:,1),2)
39.3 µs ± 147 ns per loop (mean ± std. dev. of 7 runs,10000 loops each)

关于如何使用另一个Numpy数组设置多维Numpy数组的单个元素?numpy 多维数组的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于python numpy数组的numpy数组、python – 用另一个数组中的随机元素填充numpy数组、从numpy数组列表创建numpy数组的Python方法、从两个多维numpy数组复制到另一个具有不同形状的数组的相关信息,请在本站寻找。

本文标签: