本篇文章给大家谈谈numpy数组中相邻单元的计数,以及numpy数组相等的知识点,同时本文还将给你拓展Numpy数组中某个轴重复值的累积计数、pythonnumpy数组的numpy数组、python–
本篇文章给大家谈谈numpy数组中相邻单元的计数,以及numpy数组相等的知识点,同时本文还将给你拓展Numpy数组中某个轴重复值的累积计数、python numpy数组的numpy数组、python – 在numpy数组中的索引,其中slice在另一个数组中、python – 大型2D numpy数组中相同元素的高效成对计算等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:- numpy数组中相邻单元的计数(numpy数组相等)
- Numpy数组中某个轴重复值的累积计数
- python numpy数组的numpy数组
- python – 在numpy数组中的索引,其中slice在另一个数组中
- python – 大型2D 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 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数组
我在创建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在另一个数组中
我有两个阵列如下:
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数组中相同元素的高效成对计算
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.然而,它以“浓缩”形式返回输出,并且由于我们试图避免转换为完全密集阵列以节省内存,因此问题可能变成:如何将压缩距离矩阵转换为稀疏矩阵?
解决方法
你将无法像condensed output那样提高内存效率.实际上,当写入“稀疏”格式时,需要一个(N *(N-1)/ 2,3)矩阵,与pdist返回的N *(N-1)/ 2向量相比
今天关于numpy数组中相邻单元的计数和numpy数组相等的介绍到此结束,谢谢您的阅读,有关Numpy数组中某个轴重复值的累积计数、python numpy数组的numpy数组、python – 在numpy数组中的索引,其中slice在另一个数组中、python – 大型2D numpy数组中相同元素的高效成对计算等更多相关知识的信息可以在本站进行查询。
本文标签: