Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在Python中将数组简化为唯一值_Php_Python_Arrays_Numpy - Fatal编程技术网

Php 如何在Python中将数组简化为唯一值

Php 如何在Python中将数组简化为唯一值,php,python,arrays,numpy,Php,Python,Arrays,Numpy,由于PHP中的数组深度问题,从Python接收此数组会被省略号(“…”)截断。在返回php之前,我想用Python处理数组 澄清:我需要维护内部集合[135、121、81]。这些是R,G,B值,我把它们和多次出现的组集联系起来。集合中的值需要保持[1,2,3]顺序,而不是下面一些答案所建议的[1,2,3,4,5,6,7,8] 您如何将此3Dnumpy.ndarray简化为一组独特的RGB三元组? 以下是Python如何打印数组: [[[135 121 81] [135 121 81]

由于PHP中的数组深度问题,从Python接收此数组会被省略号(“…”)截断。在返回php之前,我想用Python处理数组

澄清:我需要维护内部集合[135、121、81]。这些是R,G,B值,我把它们和多次出现的组集联系起来。集合中的值需要保持[1,2,3]顺序,而不是下面一些答案所建议的[1,2,3,4,5,6,7,8]

您如何将此3D
numpy.ndarray
简化为一组独特的RGB三元组?

以下是Python如何打印数组:

[[[135 121  81]
  [135 121  81]
  [135 121  81]
  ..., 
  [135 121  81]
  [135 121  81]
  [135 121  81]]

 [[135 121  81]
  [135 121  81]
  [135 121  81]
  ..., 
  [135 121  81]
  [135 121  81]
  [135 121  81]]

 [[ 67  68  29]
  [135 121  81]
  [ 67  68  29]
  ..., 
  [135 121  81]
  [135 121  81]
  [135 121  81]]

 ..., 
 [[200 170  19]
  [200 170  19]
  [200 170  19]
  ..., 
  [ 67  68  29]
  [ 67  68  29]
  [ 67  68  29]]

 [[200 170  19]
  [200 170  19]
  [200 170  19]
  ..., 
  [116 146  15]
  [116 146  15]
  [116 146  15]]

 [[200 170  19]
  [200 170  19]
  [200 170  19]
  ..., 
  [116 146  15]
  [116 146  15]
  [116 146  15]]]
以下是我尝试的代码:

def uniquify(arr)
    keys = []

    for c in arr:
        if not c in keys:
            keys[c] = 1
        else:
            keys[c] += 1

    return keys

result = uniquify(items)

itertools
这里是您的朋友:

>>> import itertools
>>> array = [1,1,1,2,2,2,3,3,3,4,5,6,6,6]
>>> [x[0] for x in itertools.groupby(array)]
[1, 2, 3, 4, 5, 6]
例如:

array = [[[135,121,81],
          [135,121,81],
          [135,121,81],
          [135,121,81],
          [135,121,81],
          [135,121,81]],
         [[135,121,81],
          [135,121,81],
          [135,121,81],
          [135,121,81],
          [135,121,81],
          [135,121,81]],
         [[67,68,29],
          [135,121,81],
          [67,68,29],
          [135,121,81],
          [135,121,81],
          [135,121,81]]]

import itertools

new_array = list()
for inner in array:
    new_inner = [x[0] for x in itertools.groupby(inner)]
    new_array.append(new_inner)
产生:

[ [ [135, 121, 81] ], 
  [ [135, 121, 81] ],
  [ [67, 68, 29],
    [135, 121, 81],
    [67, 68, 29],
    [135, 121, 81] ] ]

不是很独特,但您可以对
内部
进行排序,以仅获得唯一性。

itertools
是您的朋友吗:

>>> import itertools
>>> array = [1,1,1,2,2,2,3,3,3,4,5,6,6,6]
>>> [x[0] for x in itertools.groupby(array)]
[1, 2, 3, 4, 5, 6]
例如:

array = [[[135,121,81],
          [135,121,81],
          [135,121,81],
          [135,121,81],
          [135,121,81],
          [135,121,81]],
         [[135,121,81],
          [135,121,81],
          [135,121,81],
          [135,121,81],
          [135,121,81],
          [135,121,81]],
         [[67,68,29],
          [135,121,81],
          [67,68,29],
          [135,121,81],
          [135,121,81],
          [135,121,81]]]

import itertools

new_array = list()
for inner in array:
    new_inner = [x[0] for x in itertools.groupby(inner)]
    new_array.append(new_inner)
产生:

[ [ [135, 121, 81] ], 
  [ [135, 121, 81] ],
  [ [67, 68, 29],
    [135, 121, 81],
    [67, 68, 29],
    [135, 121, 81] ] ]

不完全唯一,但您可以对
内部
进行排序以获得唯一性。

假设python
列表
看起来像
[[1,2,3],[4,5,6],[[7,8,9]]]
(也就是说,一个
列表的
列表
s的
整数

mylist = [[[1,2,3], [4,5,6]], [[7,8,9]]]
items = set()
for sublist in mylist:
    for subsublist in sublist:
        for item in subsublist:
            items.add(item)
如果您随后特别需要一个
列表
,您可以将其转换为:
项目=列表(项目)

集合
是一种类似于
列表
的数据类型,但不包含重复项。
数据类型的一个副作用是没有保留插入顺序-如果这对您很重要,您将需要类似以下内容:

mylist = [[[1,2,3], [4,5,6]], [[7,8,9]]]
items = []
for sublist in mylist:
    for subsublist in sublist:
        for item in subsublist:
            if not item in items:
                items.add(item)
编辑:根据您的编辑,您可能需要:

mylist = [[[1,2,3], [4,5,6]], [[7,8,9], [1,2,3]]]
items = []
for sublist in mylist:
    for item in sublist:
        if not item in items:
            items.append(item)
# items = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

假设python的
列表
看起来像
[[1,2,3],[4,5,6],[[7,8,9]]
(也就是说,一个
列表
列表
s的
整数

mylist = [[[1,2,3], [4,5,6]], [[7,8,9]]]
items = set()
for sublist in mylist:
    for subsublist in sublist:
        for item in subsublist:
            items.add(item)
如果您随后特别需要一个
列表
,您可以将其转换为:
项目=列表(项目)

集合
是一种类似于
列表
的数据类型,但不包含重复项。
数据类型的一个副作用是没有保留插入顺序-如果这对您很重要,您将需要类似以下内容:

mylist = [[[1,2,3], [4,5,6]], [[7,8,9]]]
items = []
for sublist in mylist:
    for subsublist in sublist:
        for item in subsublist:
            if not item in items:
                items.add(item)
编辑:根据您的编辑,您可能需要:

mylist = [[[1,2,3], [4,5,6]], [[7,8,9], [1,2,3]]]
items = []
for sublist in mylist:
    for item in sublist:
        if not item in items:
            items.append(item)
# items = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

根据“数组”的表示形式,看起来您使用的是
numpy.ndarray
。如果是这种情况,这将成为一个非常简单的问题--您可以使用
.flat
属性将其转换为一维iterable simple。要使其唯一,只需使用

set(array.flat)
这将为您提供一个集合,但您可以很容易地从中获得一个列表:

list(set(array.flat))
下面是它的工作原理:

>>> array = np.zeros((10,12,42,53))
>>> list(set(array.flat))
[0.0]
作为旁注,还有
np.unique
,它也将为您提供数组中唯一的元素

>>> array = np.zeros((10,12),dtype=int)
>>> print array
[[0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0]]
>>> np.unique(array)
array([0])
>>> array[0,5] = 1
>>> array[4,10] = 42
>>> np.unique(array)
array([ 0,  1, 42])

我想我终于明白了这一点:

from itertools import product

items = set(tuple(a[itr+(slice(None),)]) for itr in product(*[range(x) for x in a.shape[:-1]]))
print items
似乎有用。呸

工作原理——您希望保留为三元组的片段访问方式如下:

array[X,Y,:]
因此,我们只需要循环使用
X
Y
的所有组合。这正是
itertools.product
的优点。我们可以在任意数量的维度中获得有效的
X
Y

[range(x) for x in array.shape[:-1]]
因此,我们将其传递给产品:

indices_generator = product(*[range(x) for x in array.shape[:-1]])
现在我们有了一些可以生成第一个索引的东西——我们只需要构造一个元组来传递给
\uuu getitem\uuuu
,numpy将其解释为
(X,Y,:)
——这很简单,我们已经从索引生成器中获得了
(X,Y)
——我们只需要添加一个emtpy切片:

all_items = ( array[idx+(slice(None),)] for idx in indices_generator )
现在,我们可以循环查看所有_项,查找具有以下集合的唯一项:

unique_items = set(tuple(item) for item in all_items)

现在将其转换回列表、numpy数组或任何您想要的内容,以便将其传递回PHP。

基于“数组”的表示形式,看起来您使用的是
numpy.ndarray
。如果是这种情况,这将成为一个非常简单的问题--您可以使用
.flat
属性将其转换为一维iterable simple。要使其唯一,只需使用
集即可:

set(array.flat)
这将为您提供一个集合,但您可以很容易地从中获得一个列表:

list(set(array.flat))
下面是它的工作原理:

>>> array = np.zeros((10,12,42,53))
>>> list(set(array.flat))
[0.0]
作为旁注,还有
np.unique
,它也将为您提供数组中唯一的元素

>>> array = np.zeros((10,12),dtype=int)
>>> print array
[[0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0]]
>>> np.unique(array)
array([0])
>>> array[0,5] = 1
>>> array[4,10] = 42
>>> np.unique(array)
array([ 0,  1, 42])

我想我终于明白了这一点:

from itertools import product

items = set(tuple(a[itr+(slice(None),)]) for itr in product(*[range(x) for x in a.shape[:-1]]))
print items
似乎有用。呸

工作原理——您希望保留为三元组的片段访问方式如下:

array[X,Y,:]
因此,我们只需要循环使用
X
Y
的所有组合。这正是
itertools.product
的优点。我们可以在任意数量的维度中获得有效的
X
Y

[range(x) for x in array.shape[:-1]]
因此,我们将其传递给产品:

indices_generator = product(*[range(x) for x in array.shape[:-1]])
现在我们有了一些可以生成第一个索引的东西——我们只需要构造一个元组来传递给
\uuu getitem\uuuu
,numpy将其解释为
(X,Y,:)
——这很简单,我们已经从索引生成器中获得了
(X,Y)
——我们只需要添加一个emtpy切片:

all_items = ( array[idx+(slice(None),)] for idx in indices_generator )
现在,我们可以循环查看所有_项,查找具有以下集合的唯一项:

unique_items = set(tuple(item) for item in all_items)

现在将其转换回列表、numpy数组或任何您想要的内容,以便将其传递回PHP。

查看文档中的配方。有
flatte
unique\u everseen
函数可以完全满足您的需要

因此,您可以复制并粘贴它们。或者您也可以导入它们。现在,您可以将3D阵列展平为2D,并使用
unique\u everseen
对2D阵列进行唯一化

除了一个问题。2D数组的元素是不可散列的
list
s,因此必须将它们转换为可散列的元素。但这很简单:

def uniquify(arr3d):
    return unique_everseen(flatten(arr3d), tuple)
就这样

如果你在粘贴这些函数时看它们的实现,它们非常简单