GVKun编程网logo

在一个numpy数组中相乘(numpy数组乘一个数)

11

如果您想了解在一个numpy数组中相乘的相关知识,那么本文是一篇不可错过的文章,我们将对numpy数组乘一个数进行全面详尽的解释,并且为您提供关于numpy数组中相邻单元的计数、python–两个nu

如果您想了解在一个numpy数组中相乘的相关知识,那么本文是一篇不可错过的文章,我们将对numpy数组乘一个数进行全面详尽的解释,并且为您提供关于numpy数组中相邻单元的计数、python – 两个numpy数组中所有行的组合、python – 大型2D numpy数组中相同元素的高效成对计算、Python-在一维numpy数组中用Numpy查找局部最大值/最小值的有价值的信息。

本文目录一览:

在一个numpy数组中相乘(numpy数组乘一个数)

在一个numpy数组中相乘(numpy数组乘一个数)

我试图将2D数组中的每个项乘以1D数组中的相应项。如果我想将每一列乘以一维数组,这非常容易,如numpy.multiply函数所示。但是我想相反,将行中的每一项相乘。换句话说,我想乘以:

[1,2,3]   [0][4,5,6] * [1][7,8,9]   [2]

并得到

[0,0,0][4,5,6][14,16,18]

但是我得到了

[0,2,6][0,5,12][0,8,18]

有谁知道用numpy可以做到这一点吗?非常感谢Alex

答案1

小编典典

像您显示的正常乘法:

>>> import numpy as np>>> m = np.array([[1,2,3],[4,5,6],[7,8,9]])>>> c = np.array([0,1,2])>>> m * carray([[ 0,  2,  6],       [ 0,  5, 12],       [ 0,  8, 18]])

如果添加轴,它将使您所需的方式成倍增加:

>>> m * c[:, np.newaxis]array([[ 0,  0,  0],       [ 4,  5,  6],       [14, 16, 18]])

您还可以移调两次:

>>> (m.T * c).Tarray([[ 0,  0,  0],       [ 4,  5,  6],       [14, 16, 18]])

numpy数组中相邻单元的计数

numpy数组中相邻单元的计数

午夜过后,也许有人知道如何解决我的问题。我想将相邻单元格的数量(这意味着具有其他值的数组字段的数量,例如数组值附近的零)作为 每个有效值的 总和

例:

import numpy,scipy
s = ndimage.generate_binary_structure(2,2) # Structure can vary
a = numpy.zeros((6,6),dtype=numpy.int) # Example array
a[2:4,2:4] = 1;a[2,4] = 1 # with example value structure
print a 
>[[0 0 0 0 0 0]
  [0 0 0 0 0 0]
  [0 0 1 1 1 0]
  [0 0 1 1 0 0]
  [0 0 0 0 0 0]
  [0 0 0 0 0 0]]
# The value at position [2,4] is surrounded by 6 zeros,while the one at
# position [2,2] has 5 zeros in the vicinity if 's' is the assumed binary structure. 
# Total sum of surrounding zeroes is therefore sum(5+4+6+4+5) == 24

如果我的值的结构变化,我如何以这种方式计算零的数量?我以某种方式认为必须使用SciPy的binary_dilation函数,该函数能够扩大值结构,但是对重叠的简单计数不能使我得出正确的总和?

print ndimage.binary_dilation(a,s).astype(a.dtype)
[[0 0 0 0 0 0]
 [0 1 1 1 1 1]
 [0 1 1 1 1 1]
 [0 1 1 1 1 1]
 [0 1 1 1 1 0]
 [0 0 0 0 0 0]]

python – 两个numpy数组中所有行的组合

python – 两个numpy数组中所有行的组合

我有两个数组,例如形状(3,2)和另一个形状(10,7).我想要两个数组的所有组合,这样我最终得到一个9列数组.换句话说,我希望第一个数组的每一行的所有组合与第二个数组的行.

我怎样才能做到这一点?据我所知,我没有正确使用meshgrid.

根据以前的帖子,我的印象是

a1 = np.zeros((10,7))
a2 = np.zeros((3,2))
r = np.array(np.meshgrid(a1,a2)).T.reshape(-1,a1.shape[1] + a2.shape[1])

会工作,但这给我的尺寸(84,10).

最佳答案
方法#1

关注性能这里的一种方法是使用数组初始化和元素广播进行分配 –

m1,n1 = a1.shape
m2,n2 = a2.shape
out = np.zeros((m1,m2,n1+n2),dtype=int)
out[:,:,:n1] = a1[:,None,:]
out[:,n1:] = a2
out.shape = (m1*m2,-1)

说明:

诀窍在于两个步骤:

out[:,n1:] = a2

步骤1 :

In [227]: np.random.seed(0)

In [228]: a1 = np.random.randint(1,9,(3,2))

In [229]: a2 = np.random.randint(1,(2,7))

In [230]: m1,n1 = a1.shape
     ...: m2,n2 = a2.shape
     ...: out = np.zeros((m1,dtype=int)
     ...: 

In [231]: out[:,:]

In [232]: out[:,:n1]
Out[232]: 
array([[[5,8],[5,8]],[[6,1],[6,1]],[[4,4],[4,4]]])

In [233]: a1[:,:]
Out[233]: 
array([[[5,4]]])

因此,基本上我们分配a1的元素,保持第一轴与输出中相应的一个轴对齐,同时让输出数组的第二轴上的元素以广播的方式填充,对应于为a1添加的newaxis那个轴.这是关键所在并带来性能,因为我们没有分配额外的内存空间,否则我们需要使用显式的重复/平铺方法.

第2步 :

In [237]: out[:,n1:] = a2

In [238]: out[:,n1:]
Out[238]: 
array([[[4,8,2,4,6,3,5],[8,7,1,5,2]],2]]])

In [239]: a2
Out[239]: 
array([[4,2]])

这里,我们基本上沿着输出数组的第一轴广播块a2而不明确地重复复制.

样本输入,输出完整性 –

In [242]: a1
Out[242]: 
array([[5,4]])

In [243]: a2
Out[243]: 
array([[4,2]])

In [244]: out
Out[244]: 
array([[[5,2]]])

方法#2

另一个有平铺/重复 –

parte1 = np.repeat(a1[:,:],axis=0).reshape(-1,m2)
parte2 = np.repeat(a2[None],m1,n2)
out = np.c_[parte1,parte2] 

python – 大型2D numpy数组中相同元素的高效成对计算

python – 大型2D numpy数组中相同元素的高效成对计算

我有一个2D numpy数组,有数十万行和一千个左右的列(假设它是一个N×P数组,N = 200,000,P = 1000).这里的目标是计算每对行向量之间相同元素的数量,理想情况下使用numpy数组魔术,不需要我执行199,999 * 100,000个这样的对的循环.由于存储200,000×200,000阵列可能不可行,因此输出可能是Nx3稀疏坐标格式,例如,如果输入的形式如下:

5 12 14 200   0 45223
7 12 14   0 200 60000
7  6 23   0   0 45223
5  6 14 200   0 45223

得到的(密集的)NxN矩阵M将是(不关心对角线元素):

0 2 2 4
2 0 2 1
2 2 0 3
4 1 3 0

假设基于0的索引,Mij包含初始行i和初始行j之间的相同元素的数量.
因此,预期的稀疏输出等价物将是:

0 1 2
0 2 2
0 3 4
1 2 2 
1 3 1
2 3 3

一种天真的,非常低效的实现方法是:

import itertools
import numpy as np

def pairwise_identical_elements(small_matrix):
    n,p = small_matrix.shape
    coordinates = itertools.combinations(range(n),2)
    sparse_coordinate_matrix = []
    for row1,row2 in itertools.combinations(small_matrix,2):
        idx1,idx2 = next(coordinates)
        count = p - np.count_nonzero(row1 - row2)
        sparse_coordinate_matrix.append([idx1,idx2,count])
    return sparse_coordinate_matrix

我已经研究了距离度量实现,例如scipy和sklearn中的Jaccard相似性,但它们都假设输入行向量必须是二进制的.我还尝试添加第三个维度以使条目成为二进制(例如,条目’9’成为零的向量,在第9个位置具有1)但是存在明显的内存问题(条目’45223’将需要第三维伸展那么多元素).

是否有一种高效,可扩展和/或pythonic解决方案使用numpy或scipy以我错过的方式?

编辑:在进一步研究scipy之后,我发现了一些与我正在尝试的东西非常匹配的东西,即具有汉明度量的scipy.sparse.distance.pdist.然而,它以“浓缩”形式返回输出,并且由于我们试图避免转换为完全密集阵列以节省内存,因此问题可能变成:如何将压缩距离矩阵转换为稀疏矩阵?

解决方法

正如评论中所说,scipy的 pdist带有’hamming’是解决这个问题的最简单有效的方法,无论是考虑空间还是考虑cpu时间.

你将无法像condensed output那样提高内存效率.实际上,当写入“稀疏”格式时,需要一个(N *(N-1)/ 2,3)矩阵,与pdist返回的N *(N-1)/ 2向量相比

Python-在一维numpy数组中用Numpy查找局部最大值/最小值

Python-在一维numpy数组中用Numpy查找局部最大值/最小值

你能否建议使用numpy / scipy中的模块函数在一维numpy数组中找到局部最大值/最小值?显然,最简单的方法是看一下最近的邻居,但我希望有一个被接受的解决方案,它是numpy发行版的一部分。

答案1

小编典典

如果你要查找一维数组中所有a小于其邻居的条目,则可以尝试

numpy.r_[True, a[1:] < a[:-1]] & numpy.r_[a[:-1] < a[1:], True]

你还可以在使用此步骤之前使数组平滑numpy.convolve()

我认为没有专用的功能。

关于在一个numpy数组中相乘numpy数组乘一个数的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于numpy数组中相邻单元的计数、python – 两个numpy数组中所有行的组合、python – 大型2D numpy数组中相同元素的高效成对计算、Python-在一维numpy数组中用Numpy查找局部最大值/最小值的相关信息,请在本站寻找。

本文标签: