【问题标题】:Using Numpy Array to Create Unique Array使用 Numpy 数组创建唯一数组
【发布时间】:2014-08-18 17:22:44
【问题描述】:

你能创建一个包含所有唯一值的 numpy 数组吗?

myArray = numpy.random.random_integers(0,100,2500)
myArray.shape = (50,50)

所以这里我有一个给定的随机 50x50 numpy 数组,但我可以有非唯一值。有没有办法确保每个值都是唯一的?

谢谢

更新:

我创建了一个基本函数来生成一个列表并填充一个唯一的整数。

        dist_x = math.sqrt(math.pow((extent.XMax - extent.XMin), 2))
        dist_y = math.sqrt(math.pow((extent.YMax - extent.YMin),2))
        col_x = int(dist_x / 100)
        col_y = int(dist_y / 100)
        if col_x % 100 > 0:
            col_x += 1
        if col_y % 100 > 0:
            col_y += 1
        print col_x, col_y, 249*169
        count = 1
        a = []

        for y in xrange(1, col_y + 1):
            row = []
            for x in xrange(1, col_x + 1):
                row.append(count)
                count += 1
            a.append(row)
            del row

        numpyArray = numpy.array(a)

有没有更好的方法来做到这一点?

谢谢

【问题讨论】:

  • 您似乎要求 2500 个介于 0 和 100 之间的唯一随机整数。这应该很明显为什么不会发生......
  • 我在问是否有内置方法或快速方法可以做到这一点?
  • 您需要随机数还是唯一的?如果只是独一无二的,也许np.random.permutation(np.arange(N))?

标签: python arrays numpy unique


【解决方案1】:

从集合中获取唯一随机样本的最方便的方法可能是np.random.choicereplace=False

例如:

import numpy as np

# create a (5, 5) array containing unique integers drawn from [0, 100]
uarray = np.random.choice(np.arange(0, 101), replace=False, size=(5, 5))

# check that each item occurs only once
print((np.bincount(uarray.ravel()) == 1).all())
# True

如果replace=False 您要从中采样的集合当然必须至少与您尝试抽取的样本数量一样大:

np.random.choice(np.arange(0, 101), replace=False, size=(50, 50))
# ValueError: Cannot take a larger sample than population when 'replace=False'

如果您要查找的只是 1 和数组中元素数之间的整数的随机排列,您也可以像这样使用 np.random.permutation

nrow, ncol = 5, 5
uarray = (np.random.permutation(nrow * ncol) + 1).reshape(nrow, ncol)

【讨论】:

  • 所以如果我知道列/行数我应该能够做到这一点? numpyArray = numpy.random.choice(numpy.arange(1, (col_x*col_y)+1), replace=0, size=(col_x, col_y))。这应该会导致我在矩阵中的每个列/行位置获得正确的大小和允许的唯一值。
  • 好吧,如果您只想随机排列(包括)[1, col_x * col_y] 范围内的元素,您不妨使用(np.random.permutation(col_x * col_y) + 1).reshape(col_x, col_y),正如我认为@oja 所暗示的那样。跨度>
【解决方案2】:

只需使用 replace = False。

import numpy as np


def generate():
    global x
    powerball = np.random.randint(1,27)
    numbers = np.random.choice(np.arange(1, 70), replace=False, size=(1, 5))
    x = numbers, powerball
    return x

generate()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-30
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    相关资源
    最近更新 更多