Let's start off with a random (reproducible) data array -
# Setup
In [11]: np.random.seed(0)
...: a = np.random.randint(0,9,(7,2))
...: a[2] = a[0]
...: a[4] = a[1]
...: a[6] = a[1]
# Check values
In [12]: a
Out[12]:
array([[5, 0],
[3, 3],
[5, 0],
[5, 2],
[3, 3],
[6, 8],
[3, 3]])
# Check its itemsize
In [13]: a.dtype.itemsize
Out[13]: 8
Run Code Online (Sandbox Code Playgroud)
Let's view each row as a scalar using custom datatype that covers two elements. We will use void-dtype for …
我已经尝试初始化csc_matrix并csr_matrix从(data, (rows, cols))文档建议的值列表中进行初始化.
sparse = csc_matrix((data, (rows, cols)), shape=(n, n))
Run Code Online (Sandbox Code Playgroud)
问题是,我实际上有用于产生方法data,rows和cols载体引入重复对一些点.默认情况下,scipy会添加重复条目的值.但是,在我的情况下,这些重复项data对于给定的值具有完全相同的值(row, col).
我想要实现的是让scipy忽略第二个条目,如果已经存在,而不是添加它们.
忽略我可以改进生成算法以避免生成重复的事实,是否有参数或其他方法来创建忽略重复的稀疏矩阵?
目前两个条目与data = [4, 4]; cols = [1, 1]; rows = [1, 1];生成的稀疏矩阵,其值在(1,1)是8同时所希望的值是4.
>>> c = csc_matrix(([4, 4], ([1,1],[1,1])), shape=(3,3))
>>> c.todense()
matrix([[0, 0, 0],
[0, 8, 0],
[0, 0, 0]])
Run Code Online (Sandbox Code Playgroud)
我也知道我可以通过使用二维numpy unique函数来过滤它们,但是列表非常大,所以这不是一个真正有效的选项.
问题的其他可能答案:有没有办法指定如何处理重复项?即保持min或max代替默认sum?
我有以下类型的数组:
a = array([[1,1,1],
[1,1,1],
[1,1,1],
[2,2,2],
[2,2,2],
[2,2,2],
[3,3,0],
[3,3,0],
[3,3,0]])
Run Code Online (Sandbox Code Playgroud)
我想计算每种类型数组的出现次数,例如
[1,1,1]:3, [2,2,2]:3, and [3,3,0]: 3
Run Code Online (Sandbox Code Playgroud)
我怎么能在python中实现这一点?是否可以不使用for循环并计入字典?它必须快速,并且应该花费不到0.1秒左右.我查看了Counter,numpy bincount等等.但是,这些是针对个别元素而不是数组.
谢谢.
我有3D numpy数组,我只想要独特的2D子数组.
输入:
[[[ 1 2]
[ 3 4]]
[[ 5 6]
[ 7 8]]
[[ 9 10]
[11 12]]
[[ 5 6]
[ 7 8]]]
Run Code Online (Sandbox Code Playgroud)
输出:
[[[ 1 2]
[ 3 4]]
[[ 5 6]
[ 7 8]]
[[ 9 10]
[11 12]]]
Run Code Online (Sandbox Code Playgroud)
我尝试将子数组转换为字符串(tostring()方法),然后使用np.unique,但在转换为numpy数组后,它删除了\ x00的最后一个字节,所以我无法使用np.fromstring()将其转换回来.
例:
import numpy as np
a = np.array([[[1,2],[3,4]],[[5,6],[7,8]],[[9,10],[11,12]],[[5,6],[7,8]]])
b = [x.tostring() for x in a]
print(b)
c = np.array(b)
print(c)
print(np.array([np.fromstring(x) for x in c]))
Run Code Online (Sandbox Code Playgroud)
输出:
[b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00', b'\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x00\x00', b'\t\x00\x00\x00\n\x00\x00\x00\x0b\x00\x00\x00\x0c\x00\x00\x00', b'\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x00\x00']
[b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04'
b'\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08'
b'\t\x00\x00\x00\n\x00\x00\x00\x0b\x00\x00\x00\x0c'
b'\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08'] …Run Code Online (Sandbox Code Playgroud) nunique在 numpy 中是否有与熊猫等效的行?我检查出np.unique有return_counts,但它似乎并没有回到我想要的东西。例如
a = np.array([[120.52971, 75.02052, 128.12627], [119.82573, 73.86636, 125.792],
[119.16805, 73.89428, 125.38216], [118.38071, 73.35443, 125.30198],
[118.02871, 73.689514, 124.82088]])
uniqueColumns, occurCount = np.unique(a, axis=0, return_counts=True) ## axis=0 row-wise
Run Code Online (Sandbox Code Playgroud)
结果:
>>>ccurCount
array([1, 1, 1, 1, 1], dtype=int64)
Run Code Online (Sandbox Code Playgroud)
我应该期待 all3而不是 all 1。
解决方法当然是转换为熊猫并调用,nunique但存在速度问题,我想探索一个纯 numpy 实现来加快速度。我正在处理大型数据帧,所以希望尽可能找到加速。我也愿意接受其他解决方案以加快速度。
我有一个熊猫数据框.我想通过使用一个列的组合对其进行分组,并计算另一个列组合的不同值.
例如,我有以下数据框:
a b c d e
0 1 10 100 1000 10000
1 1 10 100 1000 20000
2 1 20 100 1000 20000
3 1 20 100 2000 20000
Run Code Online (Sandbox Code Playgroud)
我可以按列对其进行分组a,b并计算列中的不同值d:
df.groupby(['a','b'])['d'].nunique().reset_index()
Run Code Online (Sandbox Code Playgroud)
结果我得到:
a b d
0 1 10 1
1 1 20 2
Run Code Online (Sandbox Code Playgroud)
但是,我想在列的组合中计算不同的值.例如,如果我使用c和d,那么在第一组中我只有一个唯一的组合((100, 1000))而在第二组中我有两个不同的组合:(100, 1000)和(100, 2000).
以下幼稚的"概括"不起作用:
df.groupby(['a','b'])[['c','d']].nunique().reset_index()
Run Code Online (Sandbox Code Playgroud)
因为nunique()不适用于数据框架.
在 numpy 中,是否有一种很好的惯用方法来测试二维数组中的所有行是否不同?
我以为我能做到
len(np.unique(arr)) == len(arr)
Run Code Online (Sandbox Code Playgroud)
但这根本不起作用。例如,
arr = np.array([[1,2,3],[1,2,4]])
np.unique(arr)
Out[4]: array([1, 2, 3, 4])
Run Code Online (Sandbox Code Playgroud) 给定一个2 xd维numpy数组M,我想计算M每列的出现次数.也就是说,我正在寻找一般的版本bincount.
到目前为止我尝试过:(1)将列转换为元组(2)使用散列元组(via hash)到自然数(3)numpy.bincount.
这看起来很笨拙.有人知道更优雅高效的方式吗?
我有一个 numpy 数组列表,想要检查所有数组是否相等。做到这一点最快的方法是什么?
我知道 numpy.array_equal 函数(https://docs.scipy.org/doc/numpy-1.10.0/reference/ generated/numpy.array_equal.html),但据我所知,这仅适用于两个数组,我想相互检查 N 个数组。
我还找到了这个答案来测试列表中的所有元素:检查列表中的所有元素是否相同。但是,当我尝试接受的答案中的每种方法时,我得到一个异常(ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all())
谢谢,
我的问题
假设我有
a = np.array([ np.array([1,2]), np.array([3,4]), np.array([5,6]), np.array([7,8]), np.array([9,10])])
b = np.array([ np.array([5,6]), np.array([1,2]), np.array([3,192])])
Run Code Online (Sandbox Code Playgroud)
它们是两个大小不同的数组,包含其他数组(内部数组的大小相同!)
我想计算b中有多少项(即内部数组)。请注意,我没有考虑他们的位置!
我怎样才能做到这一点?
我的尝试
count = 0
for bitem in b:
for aitem in a:
if aitem==bitem:
count+=1
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法?特别是一行,也许有些理解。
python ×10
numpy ×9
arrays ×4
pandas ×3
duplicates ×1
group-by ×1
python-3.x ×1
scipy ×1
sub-array ×1
unique ×1