GVKun编程网logo

numpy数组中相邻单元的计数(numpy数组相等)

27

本篇文章给大家谈谈numpy数组中相邻单元的计数,以及numpy数组相等的知识点,同时本文还将给你拓展Numpy数组中某个轴重复值的累积计数、pythonnumpy数组的numpy数组、python–

本篇文章给大家谈谈numpy数组中相邻单元的计数,以及numpy数组相等的知识点,同时本文还将给你拓展Numpy数组中某个轴重复值的累积计数、python numpy数组的numpy数组、python – 在numpy数组中的索引,其中slice在另一个数组中、python – 大型2D numpy数组中相同元素的高效成对计算等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

numpy数组中相邻单元的计数(numpy数组相等)

numpy数组中相邻单元的计数(numpy数组相等)

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

例:

import numpy, scipys = ndimage.generate_binary_structure(2,2) # Structure can varya = numpy.zeros((6,6), dtype=numpy.int) # Example arraya[2:4, 2:4] = 1;a[2,4] = 1 # with example value structureprint 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]]

答案1

小编典典

使用 卷积 计算邻居数:

import numpyimport scipy.signala = numpy.zeros((6,6), dtype=numpy.int) # Example arraya[2:4, 2:4] = 1;a[2,4] = 1 # with example value structureb = 1-ac = scipy.signal.convolve2d(b, numpy.ones((3,3)), mode=''same'')print numpy.sum(c * a)

b = 1-a 允许我们计算每个零而忽略它们。

我们使用一个3x3全为内核,将每个元素设置为其元素与它的8个相邻值的和(其他内核也是可能的,例如+仅正交相邻值的内核)。使用这些求和的值,我们屏蔽了原始输入中的零(因为我们不在乎它们的邻居),并对整个数组求和。

Numpy数组中某个轴重复值的累积计数

Numpy数组中某个轴重复值的累积计数

也许有一种使用 numpy ufuncs 的更快方法,但是这里有一个使用标准 python 的解决方案:

from collections import defaultdict
import numpy as np

a = np.array([[4,5,6,8,6],[5,1,9,5],[7,[9,2,3,3],[1,8]])

# define function
def get_count(array):
    count = []
    for row in array.T:
        occurences = defaultdict(int)
        rowcount = []
        for n in row:
            occurences[n] += 1
            rowcount.append(occurences[n] - 1)
        count.append(rowcount)
    return np.array(count).T

输出:

>>> get_count(a)
array([[0,0],[0,1],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数组中的索引,其中slice在另一个数组中

python – 在numpy数组中的索引,其中slice在另一个数组中

实际问题出现在某些机器学习应用程序中,数据有点复杂.所以这是一个能够捕捉问题本质的MWE:

我有两个阵列如下:

L = np.arange(12).reshape(4,3)
M = np.arange(12).reshape(6,2)

现在,我想在L中找到行R,这样在M中存在一些由R中除了最后一个元素之外的所有元素组成的行.

从上面的示例代码中,L和M看起来像这样:

array([[ 0,1,2],# L
       [ 3,4,5],[ 6,7,8],[ 9,10,11]])

array([[ 0,1],# M
       [ 2,3],[ 4,7],[ 8,9],[10,11]])

我想从这些,L中标记的行,作为一个numpy数组:

array([[ 0,8]])

如果我将L和M表示为python列表,我会这样做:

L = [[0,[3,[6,[9,11]]
M = [[0,[2,[4,[8,11]]
answer = [R for R in L if R[:-1] in M]

现在,我知道我可以在numpy中使用类似的列表理解并将结果转换为数组,numpy就像它一样令人敬畏,可能有更优雅的方式来做我不知道的事情.

我试着查看np.where(获取所需的索引,然后我可以用它来接收L),但这似乎没有做我需要的.

我很感激任何帮助

解决方法

>>> import hashlib
>>> fn = lambda xs: hashlib.sha1(xs).hexdigest()
>>> m = np.apply_along_axis(fn,M)
>>> l = np.apply_along_axis(fn,L[:,:-1])
>>> L[np.in1d(l,m)]
array([[0,8]])

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向量相比

今天关于numpy数组中相邻单元的计数numpy数组相等的介绍到此结束,谢谢您的阅读,有关Numpy数组中某个轴重复值的累积计数、python numpy数组的numpy数组、python – 在numpy数组中的索引,其中slice在另一个数组中、python – 大型2D numpy数组中相同元素的高效成对计算等更多相关知识的信息可以在本站进行查询。

本文标签: