Php 如何在Python中将数组简化为唯一值
由于PHP中的数组深度问题,从Python接收此数组会被省略号(“…”)截断。在返回php之前,我想用Python处理数组 澄清:我需要维护内部集合[135、121、81]。这些是R,G,B值,我把它们和多次出现的组集联系起来。集合中的值需要保持[1,2,3]顺序,而不是下面一些答案所建议的[1,2,3,4,5,6,7,8] 您如何将此3DPhp 如何在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]
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)
就这样
如果你在粘贴这些函数时看它们的实现,它们非常简单