如何改进从2D numpy数组的数组中删除重复元素的方法?

3

我尝试运行下面的代码,但是需要很长时间,有没有办法改进这个代码?我尝试了很多Python函数,但它们似乎都是为处理1D数组设计的,对于这段代码我很抱歉,因为我非常新手:

一个返回包含唯一元素的数组的函数:


```python def unique_array(arr): unique = [] for i in arr: if i not in unique: unique.append(i) return unique ```
def get_unique_values(dataset):
    uniqueimages=np.empty(dataset.shape, dtype=np.float32)
    u=0

    for i in range(dataset.shape[0]):
        if (check_if_exists(dataset[i,:,:],uniqueimages)==0):
            uniqueimages[u,:,:]=dataset[i,:,:]
            u=u+1

    return uniqueimages[0:u,:,:] 

验证给定元素是否已经存在于数组中的函数:

def check_if_exists( q,a ):
    r=0
    for i in range(a.shape[0]):
        if np.array_equal(q,a[i,:,:]):
            r=1
            break

    return r

然后我以一个3D数组作为输入运行它(形状= 2000,28,28):

vadu=get_unique_values(3Darray)

编辑:这个问题已经在其他链接的问题中解决,谢谢Divakar!


1
这非常宽泛。您可以在某些展平视图或哈希上使用np.unique()并处理哈希。但是这个决定盲目地做是很困难的。 - sascha
谢谢Sascha,我尝试了np.unique但是它将2D数组的比较看作是内部数字的比较,而且比较不准确。我认为这个函数对1D数组更有用。我会研究哈希,并看看能发现什么。 - Piero G.
好的,3D数组是图像数组,因此2D数组是其中的元素。当我运行np.unique时,它会将我的3D数组转换为形状为(256,)的1D数组。我想,由于2D数组表示图像,它们仅包含从0到256的值,而np.unique仅比较数字而不是整个2D元素。这就是我构建函数的原因。 - Piero G.
首先阅读文档,特别是参数:axis - sascha
是的,在Python3的np.unique中没有'axis'参数。文档中说:“参数:输入数组 - 如果它不是1-D,则会被展平。”我真的不知道该如何解决这个问题。 - Piero G.
显示剩余3条评论
1个回答

1
如果您想从numpy数组中获取唯一元素,可以使用numpy的unique函数。
import numpy as np

a = np.array([1,2,2,3,4,2,4])
np.unique(a)
array([1, 2, 3, 4])

我尝试将3D数组转换为1D数组。
trd.shape (200000, 28, 28) newarray=np.unique(trd) v.shape (256,)
我想说的是,这个3D数组包含了2D数组形式的图像,所以每个元素的值都在0到256之间。不知道为什么要将原始数组转换为1D数组。 这就是我编写上述函数的原因。
- Piero G.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接