Вы можете использовать np.where
для замены значений в массиве согласно следующему условию:
np.where((mat == mat2).all(axis=2, keepdims=True), [0,0], mat2)
array([[[0, 1],
[0, 0],
[0, 0]],
[[0, 0],
[0, 0],
[0, 0]],
[[0, 0],
[2, 2],
[0, 0]]])
Где (mat == mat2).all(axis=2, keepdims=True)
:
array([[[False],
[ True],
[ True]],
[[ True],
[ True],
[ True]],
[[ True],
[False],
[ True]]])
[1111 ] Возвращает маску тех же размеров, что и mat
, которую можно использовать в качестве условия для np.where
. Затем вам просто нужно указать, следует ли заменить эти значения на [0,0]
или mat2
в зависимости от результата.
Muench к спасению!
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" encoding="UTF-8"/>
<xsl:key name="muench" match="/root/item/status" use="."/>
<xsl:template match="/">
<root>
<xsl:for-each select="/root/item/status[generate-id() = generate-id(key('muench',.)[1])]">
<xsl:call-template name="pivot">
<xsl:with-param name="status" select="."/>
</xsl:call-template>
</xsl:for-each>
</root>
</xsl:template>
<xsl:template name="pivot">
<xsl:param name="status"/>
<items>
<status><xsl:value-of select="$status"/></status>
<xsl:for-each select="/root/item[status=$status]">
<name><xsl:value-of select="name"/></name>
</xsl:for-each>
</items>
</xsl:template>
</xsl:stylesheet>
Да, это может быть сделано в XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<!-- -->
<xsl:key name="kStatByVal"
match="status" use="."/>
<!-- -->
<xsl:key name="kItemByStat"
match="item" use="status"/>
<!-- -->
<xsl:variable name="vDoc" select="/"/>
<xsl:template match="/">
<top>
<xsl:for-each select=
"/*/*/status[generate-id()
=
generate-id(key('kStatByVal',.)[1])
]">
<items>
<status><xsl:value-of select="."/></status>
<xsl:for-each select="key('kItemByStat', .)">
<xsl:copy-of select="name"/>
</xsl:for-each>
</items>
</xsl:for-each>
</top>
</xsl:template>
</xsl:stylesheet>
Когда это преобразование применяется на исходный XML-документ:
<root>
<item>
<name>one</name>
<status>good</status>
</item>
<item>
<name>two</name>
<status>good</status>
</item>
<item>
<name>three</name>
<status>bad</status>
</item>
<item>
<name>four</name>
<status>ugly</status>
</item>
<item>
<name>five</name>
<status>bad</status>
</item>
</root>
К требуемому результату приводят:
<top>
<items>
<status>good</status>
<name>one</name>
<name>two</name>
</items>
<items>
<status>bad</status>
<name>three</name>
<name>five</name>
</items>
<items>
<status>ugly</status>
<name>four</name>
</items>
</top>
Действительно отметьте использование:
Это зависит о Вашем xslt механизме. Если Вы используете xslt 1.0 без какого-либо расширения, то Ваш подход является, конечно, лучшим.
С другой стороны, если Вам разрешают использовать exslt (особенно расширение набора узлов) или xslt 2.0, затем Вы могли сделать это более универсальным способом:
Но прежде, чем сделать это, полагайте, что это может быть излишество, если у Вас только есть некоторые набор состояний и что добавление другого состояния довольно редко.