冷血

文章 评论 浏览 27

冷血 2025-02-21 02:02:41

使用 make verbose = 1 cmake -build< path> - Verbose 自动调用使用的生成器的正确命令。

Use either make VERBOSE=1, or cmake --build <path> --verbose which automatically invokes the right command for the generator you used.

如何将CMAKE生成的Makefile与Echo编译器的命令线进行?

冷血 2025-02-21 01:14:32

您可以在屏幕截图中的红色框中看到的只是用户位于管理员控制台中的组织单元,但这只是OU的名称,确实反映了实际的用户状态。

在下面的屏幕截图中可以看到的用户状态可以在用户的​​个人资料图片下方看到:

“在此处输入图像说明”

尽可能请参阅OU的名称测试OU暂停,但是用户状态为活动> Active ,因此OU的名称不反映用户状态。

因此,就您而言,这意味着用户已正确存档,但不一定被暂停。现在回答您的问题:

任何人都可以向我解释为什么会发生这种情况,如果它是正常的,那么如果存档用户不被暂停?

是否会有任何风险?

您可能不需要在已经存档的情况下暂停用户。归档用户时,它会进入部分悬架状态,其中根据官方文档这就是存档帐户发生的事情:

  • 无法在任何系统上登录其Google帐户。这包括Google Workspace服务,例如Gmail,Google日历和驱动器。
  • 不要出现在全球地址列表中。在用户目录列表中,用户以存档状态出现。了解全球地址列表。
  • 可以被删除或未经许可,但不能暂停在管理员控制台中。

文档还提到以下内容:

  • 您可以归档主动用户和悬挂用户。如果您不构建用户,他们会返回其以前的状态,并重新获得对所有以前数据的访问。

总而言之,如果用户被暂停是否没有错,这仅意味着如果存档用户返回 true 使用API​​时,悬挂参数保存在存档之前的状态,以防万一您决定以后再归入该状态,以返回到该特定状态。

参考:

What you can see in the red box in the screenshots is just the organizational unit where the user has been located in the Admin console, however that is just a name for the OU and does reflect the actual user status.

The user status can be seen below the user's profile picture as you can see in the following screenshot:

enter image description here

As you can see the name of the OU is Test OU Suspended, but the user status is Active so the name of the OU does not reflect the user status.

So in your case this means that the user was archived correctly but is not necessarily suspended. Now to answer your question:

Can anyone explain me why this is happening, and if it's normal, is there any risk if an archived user is not suspended?

You may not need the user to be suspended as it has already been archived. When archiving a user it enters into a partial suspension state where according to the official documentation this is what happens to the archived account:

  • Can’t sign in to their Google Account, on any system. This includes Google Workspace services, such as Gmail, Google Calendar, and Drive.
  • Don’t appear in the Global Address List. In user directory listings, the user appears with archived status. Learn about the Global Address List.
  • Can be deleted or unarchived, but not suspended in the Admin console.

The documentation also mentions the following:

  • You can archive both active and suspended users. If you unarchive a user, they return to their previous state and regain access to all their previous data.

In conclusion there is nothing wrong if the user is suspended or not, this just means that if an archived user returns True in the Suspended parameter when using the API this is just to save the status it had before being archived so that in case you decide to unarchive it later on it returns back to that specific state.

References:

Google WorkPlace存档的用户被暂停

冷血 2025-02-20 23:01:01

fetch .git/config 中的行指定哪些分支是从特定遥控器中获取的,在哪些局部ref路径下它们将被镜像。

的示例。

[remote "origin"]      
        url = git@mygitserver:mygit.git
        fetch = +refs/heads/*:refs/remotes/origin/*

在这里,默认 onect fetch 行指示git以从远程获取所有头( refs/heads/*) 并将它们本地存储为 Origin/*远程分支。

显然,您的 fetch 行与默认值不同,并将远程分支反映在带有相同名称的常规本地分支上;而不是远程分支
这就是为什么您会得到警告。

您是否要将行更改为默认值取决于您。

The fetch line in .git/config specifies which branches are fetched from a particular remote and under which local ref path they will be mirrored.

Here an example of the default origin

[remote "origin"]      
        url = git@mygitserver:mygit.git
        fetch = +refs/heads/*:refs/remotes/origin/*

The fetch line instructs git to fetch all heads (branches) from the remote (refs/heads/*) and stores them locally as origin/* remote branches.

Apparently your fetch line differs from the default and mirrors the remote branches onto regular local branches with the same names; instead of remote branches
That's why you get that warning.

Whether you want to change the line back to its default is up to you.

警告重命名git遥控器

冷血 2025-02-20 22:07:18

尝试一些非常基本的东西:

let arr = [];
arr[1] = 2; arr[7] = 10;
for(let i=0; i< arr.length; i++) {
    if(!arr[i]) arr[i]=null;
}
console.log(arr);

输出:

[
  null, 2,    null,
  null, null, null,
  null, 10
]

Try something very basic:

let arr = [];
arr[1] = 2; arr[7] = 10;
for(let i=0; i< arr.length; i++) {
    if(!arr[i]) arr[i]=null;
}
console.log(arr);

Output:

[
  null, 2,    null,
  null, null, null,
  null, 10
]

用JavaScript数组中的null替换空/未定义值

冷血 2025-02-20 19:39:31

我认为您的问题是 n&gt;&gt; 0 。我不熟悉&gt;&gt;&gt; 0 ,但据我所知,它将输入转换为未签名的32位。uint的最大值是 4294967295 因此这些数字超过了它。因此,我认为转换中丢失了一些信息。

 var countBitsOld = function(n) {
  let bNum=(n>>>0).toString(2);//converts int to base 2 
  let sum=0;
  for(let i=0;i<=bNum.length-1;i++)
    {
       if(bNum[i]==1)
         sum+=1;
    }
  return sum;
};
 var countBitsNew = function(n) {
  let bNum=(n).toString(2);//converts int to base 2 
  let sum=0;
  for(let i=0;i<=bNum.length-1;i++)
    {
       if(bNum[i]==1)
         sum+=1;
    }
  return sum;
};

const test = (n) => console.log({old: countBitsOld(n), new: countBitsNew(n)});
test(9843520790);
test(8989787640);
test(76765709950);

I think your issue is n>>>0. I not to familiar with the >>>0 but as far as I know it converts the input to a 32bit unsigned in. The max value for an uint is 4294967295 so those numbers exceed it. Therefore I think some information is lost in the conversion.

 var countBitsOld = function(n) {
  let bNum=(n>>>0).toString(2);//converts int to base 2 
  let sum=0;
  for(let i=0;i<=bNum.length-1;i++)
    {
       if(bNum[i]==1)
         sum+=1;
    }
  return sum;
};
 var countBitsNew = function(n) {
  let bNum=(n).toString(2);//converts int to base 2 
  let sum=0;
  for(let i=0;i<=bNum.length-1;i++)
    {
       if(bNum[i]==1)
         sum+=1;
    }
  return sum;
};

const test = (n) => console.log({old: countBitsOld(n), new: countBitsNew(n)});
test(9843520790);
test(8989787640);
test(76765709950);

.

Java脚本将号码转换为字符串底座两个

冷血 2025-02-20 16:55:10

从Frontend中发送图像或JSON字符串中的任何媒体文件,并制作序列化器字段以处理JSON字符串。

import base64
import uuid
from rest_framework.fields import Field
from rest_framework import serializers

class Base64ContentField(Field):
    """
    For image, send base64 string as json
    """

    def to_internal_value(self, data):
        try:
            format, datastr = data.split(';base64,')
            ext = format.split('/')[-1]
            file = ContentFile(base64.b64decode(datastr), name=str(uuid.uuid4())+'.'+ext)
        except:
            raise serializers.ValidationError('Error in decoding base64 data')
        return file

    def to_representation(self, value):
        if not value:
            return None
        return value.url

您的Plantserializer看起来像

class PlantSerializer(serializers.ModelSerializer):
    img = Base64ContentField(required=False)
    class Meta:
        model = Plant
        fields = '__all__'

IMG字段的帖子数据看起来一样,

{
    "name": "some name",
    "img": "data:image/png;base64,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",
    # ... other fields
}

您可以从此;在前端像ReactJ一样,它们具有将图像转换为base64字符串的软件包

send images or any media files in json string from frontend and make a serializer field to handle the json string.

import base64
import uuid
from rest_framework.fields import Field
from rest_framework import serializers

class Base64ContentField(Field):
    """
    For image, send base64 string as json
    """

    def to_internal_value(self, data):
        try:
            format, datastr = data.split(';base64,')
            ext = format.split('/')[-1]
            file = ContentFile(base64.b64decode(datastr), name=str(uuid.uuid4())+'.'+ext)
        except:
            raise serializers.ValidationError('Error in decoding base64 data')
        return file

    def to_representation(self, value):
        if not value:
            return None
        return value.url

Your PlantSerializer looks like

class PlantSerializer(serializers.ModelSerializer):
    img = Base64ContentField(required=False)
    class Meta:
        model = Plant
        fields = '__all__'

Your post data with img field will look like this

{
    "name": "some name",
    "img": "data:image/png;base64,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",
    # ... other fields
}

You can convert images to base64 from this link; In the frontend like reactJS they have packages to convert image to base64 string

通过REST API处理图像

冷血 2025-02-20 09:44:22
$(document).ready(function(){
$('#mon_reason').on('change click', function (e) {
  var reason = $('#mon_reason').val();
  if(reason == 1){
    $("#mon-adjust").attr("disabled", true);
    $("#mon-adjust").val(0.00);
    $("#mon-total").val(8.50);
    $("#mon-worked").val(8.50);
  } if(reason == 2 || reason == 3 ) {
    $("#mon-adjust").attr("disabled", true);
        $("#mon-adjust").val(8.50);
        $("#mon-total").val(8.50);
        $("#mon-worked").val(0.00);
  } if(reason == 4 || reason == 5) {
    $("#mon-adjust").attr("disabled", true);
        $("#mon-adjust").val(4.25);
        $("#mon-total").val(8.50);
        $("#mon-worked").val(4.25);
   
  }if(reason == 6 || reason == 7) {
    $("#mon-worked").val();
    $("#mon-adjust").attr("disabled", false);
    $("#mon-adjust").on('keyup keydown change click keypress', function(){
            var val1 = +$("#mon-adjust").val();
            var val2 = +$("#mon-total").val();
            $("#mon-worked").val(val2-val1);
        });
    $("#mon-adjust").on('keyup keydown change click keypress', function(){
        $("#mon-total").val(8.50);
    });

    $("#mon-adjust").val();

    $('#mon-adjust').on('keyup click keydown change keypress', function(e){
    if ($('#mon-adjust').val() > 8.50 
        && e.keyCode !== 46
        && e.keyCode !== 8
       ) {
       e.preventDefault();    
       $('#mon-adjust').val(8.50);
    }
    });
   
    $('#mon-adjust').on('keyup click keydown change keypress', function(e){
            if ($(this).val() < 0.00 
                && e.keyCode !== 46
                && e.keyCode !== 8
            ) {
            e.preventDefault();    
            $(this).val(0.00);
    }
    });
  }if(reason == 8) {
    $("#mon-adjust").attr("disabled", false);
    $("#mon-adjust").on('keyup keydown change click keypress', function(){
            var val3 = +$("#mon-worked").val();
            var val4 = +$("#mon-adjust").val();
            $("#mon-total").val(val3+val4);
        });
    $("#mon-adjust").on('keyup keydown change click keypress', function(){
        $("#mon-worked").val(8.50);
    });

    $("#mon-adjust").val();

    $('#mon-adjust').on('keyup click keydown change keypress', function(e){
    if ($('#mon-adjust').val() > 8.50  
        && e.keyCode !== 46
        && e.keyCode !== 8
       ) {
       e.preventDefault();    
       $('#mon-adjust').val(8.50);
    }
    });
   
    $('#mon-adjust').on('keyup click keydown change keypress', function(e){
            if ($('#mon-adjust').val() < 0.00 
                && e.keyCode !== 46
                && e.keyCode !== 8
            ) {
            e.preventDefault();    
            $('#mon-adjust').val(0.00);
    }
    });
  }
  });
});

我已经重写了脚本,因此当用户选择其他选项时,在执行的新代码中更加明确时,请撤消上一个重写的代码。以下代码中的一些添加也限制了输入字段的最低和最大。

总而言之,问题在于,在满足某个条件但没有撤销时,代码正在执行,因为在改变条件时我不够明确。

$(document).ready(function(){
$('#mon_reason').on('change click', function (e) {
  var reason = $('#mon_reason').val();
  if(reason == 1){
    $("#mon-adjust").attr("disabled", true);
    $("#mon-adjust").val(0.00);
    $("#mon-total").val(8.50);
    $("#mon-worked").val(8.50);
  } if(reason == 2 || reason == 3 ) {
    $("#mon-adjust").attr("disabled", true);
        $("#mon-adjust").val(8.50);
        $("#mon-total").val(8.50);
        $("#mon-worked").val(0.00);
  } if(reason == 4 || reason == 5) {
    $("#mon-adjust").attr("disabled", true);
        $("#mon-adjust").val(4.25);
        $("#mon-total").val(8.50);
        $("#mon-worked").val(4.25);
   
  }if(reason == 6 || reason == 7) {
    $("#mon-worked").val();
    $("#mon-adjust").attr("disabled", false);
    $("#mon-adjust").on('keyup keydown change click keypress', function(){
            var val1 = +$("#mon-adjust").val();
            var val2 = +$("#mon-total").val();
            $("#mon-worked").val(val2-val1);
        });
    $("#mon-adjust").on('keyup keydown change click keypress', function(){
        $("#mon-total").val(8.50);
    });

    $("#mon-adjust").val();

    $('#mon-adjust').on('keyup click keydown change keypress', function(e){
    if ($('#mon-adjust').val() > 8.50 
        && e.keyCode !== 46
        && e.keyCode !== 8
       ) {
       e.preventDefault();    
       $('#mon-adjust').val(8.50);
    }
    });
   
    $('#mon-adjust').on('keyup click keydown change keypress', function(e){
            if ($(this).val() < 0.00 
                && e.keyCode !== 46
                && e.keyCode !== 8
            ) {
            e.preventDefault();    
            $(this).val(0.00);
    }
    });
  }if(reason == 8) {
    $("#mon-adjust").attr("disabled", false);
    $("#mon-adjust").on('keyup keydown change click keypress', function(){
            var val3 = +$("#mon-worked").val();
            var val4 = +$("#mon-adjust").val();
            $("#mon-total").val(val3+val4);
        });
    $("#mon-adjust").on('keyup keydown change click keypress', function(){
        $("#mon-worked").val(8.50);
    });

    $("#mon-adjust").val();

    $('#mon-adjust').on('keyup click keydown change keypress', function(e){
    if ($('#mon-adjust').val() > 8.50  
        && e.keyCode !== 46
        && e.keyCode !== 8
       ) {
       e.preventDefault();    
       $('#mon-adjust').val(8.50);
    }
    });
   
    $('#mon-adjust').on('keyup click keydown change keypress', function(e){
            if ($('#mon-adjust').val() < 0.00 
                && e.keyCode !== 46
                && e.keyCode !== 8
            ) {
            e.preventDefault();    
            $('#mon-adjust').val(0.00);
    }
    });
  }
  });
});

I have rewritten the script so now when a user selects a different option the previous rewritten code is undone by being more explicit in the new code which is executed. Some additions in the below code also limits the min and max of the input fields.

In summary, the issue was that code was being executed when a certain condition was being met but not being undone because I was not being explicit enough when conditions changed.

是否有一种方法可以在用户选择条件更改后从选择下拉列表中选择一个新选项后重置上一个代码?

冷血 2025-02-20 09:29:04

如果您的模拟服务器具有启用目录列表,则可以使用fetch()来执行此操作。像HTTP-Server这样的服务器默认情况下可以启用此功能。您可以通过简单地将目录地址键入浏览器并查看服务器的答复来测试Fetch()是否可以使用。如果它使用列出该目录中文件的页面回复,则获取也可以做到这一点。要解析fetch()返回的HTML页面文本,您可能必须修改以下代码,因为每个服务器都以不同的方式列出目录列表。这将与HTTP-Server一起使用:

async function getDirectory(dirname) {
  let response = await fetch(dirname);
  let str = await response.text();
  let el = document.createElement('html');
  el.innerHTML = str;

  // this parse will work for http-server and may have to be modified for other
  // servers. Inspect the returned string to determine the proper parsing method
  let list = el.getElementsByTagName("table")[0].getElementsByTagName("a");
  let arr = [];
  for (i = 0; i < list.length; i++) {
    arr[i] = list[i].innerHTML;
  }
  arr.shift(); // get rid of first result which is the "../" directory reference
  console.log(arr); // this is your list of files (or directories ending in "/")
  return(arr);
}

If your mock server has directory listings enabled, then you CAN use fetch() to do this. A server like http-server enables this by default. You can test if fetch() will work by simply typing in the directory address into a browser and see what your server replies with. If it replies with a page that lists the files in that directory then fetch can do that too. To parse the html page text that is returned by fetch() you may have to modify the code below since each server structures the directory listing differently. This will work with http-server:

async function getDirectory(dirname) {
  let response = await fetch(dirname);
  let str = await response.text();
  let el = document.createElement('html');
  el.innerHTML = str;

  // this parse will work for http-server and may have to be modified for other
  // servers. Inspect the returned string to determine the proper parsing method
  let list = el.getElementsByTagName("table")[0].getElementsByTagName("a");
  let arr = [];
  for (i = 0; i < list.length; i++) {
    arr[i] = list[i].innerHTML;
  }
  arr.shift(); // get rid of first result which is the "../" directory reference
  console.log(arr); // this is your list of files (or directories ending in "/")
  return(arr);
}

如何使用fetch列出文件夹中的文件?

冷血 2025-02-20 06:48:00

这是我们可以用来使用的习语列表

  1. pd.dataframe.pivot_table

    • groupby 具有更直观的API的荣耀版本。对于许多人来说,这是首选的方法。这是开发人员的预期方法。
    • 指定行级,列级,要汇总的值以及函数以执行聚合。
  2. + pd.dataframe.unstack.unstack

    • 良好的一般方法用于几乎任何类型的枢轴
    • 您指定将构成一个组中的所有列的行级别和列级的所有列。您可以选择要汇总的剩余列以及要执行聚合的功能。最后,您 unstack 您想在列索引中的级别。
  3. + pd.dataframe.unstack.unstack

    • 对于某些人来说方便而直观(包括我自己)。无法处理重复的分组键。
    • 类似于 groupby 范式,我们指定了最终将是行或列级并将其设置为索引的所有列。然后,我们 unstack 我们在列中想要的级别。如果剩余的索引级别或列级不是唯一的,则此方法将失败。
  4. 代码>

    • set_index非常相似,因为它共享重复的密钥限制。 API也非常有限。它仅采用 index values
    • 的标量值。

    • 类似于 pivot_table 方法,因为我们选择了枢轴的行,列和值。但是,我们不能汇总,如果行或列不是唯一的,则此方法将失败。
    • 这是 pivot_table 的专业版,最直观的方式是执行多个任务的最直观的方式。

  5. + np.bincount.bincount

    • 这是一种非常高级的技术,非常晦涩,但非常快。它在任何情况下都不能使用,但是当它可以使用并且您可以使用它时,您将获得性能奖励。
  6. + pd.dataframe.dataframe.dataframe.dot.dot

    • 我将其用于巧妙地执行交叉表。

另请参阅:


问题1问题1

为什么我获得 value eRror:索引包含重复条目,无法重塑

这是因为熊猫试图重新索引 index index 带有重复的对象条目。有不同的方法可以执行枢轴。当他们被要求旋转的密钥重复时,其中一些人不适合。例如:考虑 pd.dataframe.pivot 。我知道有重复的条目共享 col 值:

df.duplicated(['row', 'col']).any()

True

因此,当i pivot 使用i时,

df.pivot(index='row', columns='col', values='val0')

我会得到上面提到的错误。实际上,当我尝试执行相同的任务时,我会遇到相同的错误:

df.set_index(['row', 'col'])['val0'].unstack()

示例

我要为每个后续问题做什么是使用 pd.dataframe.pivot_table 。然后,我将提供执行相同任务的替代方案。

问题2和3

在是值?

  • noreferrer“>

      df.pivot_table(
        values ='val0',index ='row',列='col',
        aggfunc ='平均')
    
    COL0 COL1 COL2 COL3 COL4
    排                                  
    Row0 0.77 0.605 NAN 0.860 0.65
    Row2 0.13 NAN 0.395 0.500 0.25
    Row3 Nan 0.310 Nan 0.545 Nan
    Row4 Nan 0.100 0.395 0.760 0.24
     
    • aggfunc ='平均'是默认值,我不必设置它。我将其包括在内。

我该如何制作以使丢失值为0?

  • noreferrer“>

    • fill_value 默认设置未设置。我倾向于适当地设置它。在这种情况下,我将其设置为 0
      df.pivot_table(
        values ='val0',index ='row',列='col',
        fill_value = 0,aggfunc ='mean')
    
    COL0 COL1 COL2 COL3 COL4
    排
    Row0 0.77 0.605 0.000 0.860 0.65
    Row2 0.13 0.000 0.395 0.500 0.25
    Row3 0.00 0.310 0.000 0.545 0.00
    Row4 0.00 0.100 0.395 0.760 0.24
     
  •   df.groupby([['row','col'])['val0']。eyan()。unstack(fill_value = 0)
     
  • pd.crosstab

      pd.crosstab(
        index = df ['row'],列= df ['col'],
        值= df ['val0'],aggfunc ='mean')。填充(0)
     

问题4

我可以得到含义以外的其他东西,例如 sum

  • noreferrer“>

      df.pivot_table(
        values ='val0',index ='row',列='col',
        fill_value = 0,aggfunc ='sum')
    
    COL0 COL1 COL2 COL3 COL4
    排
    Row0 0.77 1.21 0.00 0.86 0.65
    Row2 0.13 0.00 0.79 0.50 0.50
    Row3 0.00 0.31 0.00 1.09 0.00
    Row4 0.00 0.10 0.79 1.52 0.24
     
  • pd.dataframe.groupby.groupby.groupbyby

      df.groupby(['row','col'])['val0']。sum()。unstack(fill_value = 0)
     
  • pd.crosstab

      pd.crosstab(
        index = df ['row'],列= df ['col'],
        值= df ['val0'],aggfunc ='sum')。填充(0)
     

问题5

我一次可以做更多的聚合吗?

请注意,对于 pivot_table crosstab 我需要传递可可的列表。另一方面, groupby.agg 能够为有限数量的特殊功能带上字符串。 groupby.agg 也将采取与我们传递给其他人相同的可喊声,但是由于要获得的效率,要利用字符串函数名称通常更有效。

  • noreferrer“>

      df.pivot_table(
        values ='val0',index ='row',列='col',
        fill_value = 0,aggfunc = [np.size,np.mean])
    
         尺寸均值
    COL0 COL1 COL2 COL3 COL4 COL0 COL1 COL2 COL3 COL4
    排
    Row0 1 2 0 1 1 0.77 0.605 0.000 0.860 0.65
    Row2 1 0 2 1 2 0.13 0.000 0.395 0.500 0.25
    Row3 0 1 0 2 0 0.00 0.310 0.000 0.545 0.00
    Row4 0 1 2 2 1 0.00 0.100 0.395 0.760 0.24
     
  • pd.dataframe.groupby.groupby.groupbyby

      df.groupby(['row','col'])['val0']。agg(['size','shay'])。unstack(fill_value = 0)
     
  • pd.crosstab

      pd.crosstab(
        index = df ['row'],列= df ['col'],
        值= df ['val0'],aggfunc = [np.size,np.mean])。
     

问题6

我可以在多个值列上汇总吗?

  • noreferrer“> 我们通过 values = ['val0', 'val1'] ,但我们本可以完全将其留下

      df.pivot_table(
        values = ['val0','val1'],index ='row',列='col',
        fill_value = 0,aggfunc ='mean')
    
          val0 val1
    COL0 COL1 COL2 COL3 COL4 COL0 COL1 COL2 COL3 COL4
    排
    Row0 0.77 0.605 0.000 0.860 0.65 0.01 0.745 0.00 0.010 0.02
    Row2 0.13 0.000 0.395 0.500 0.25 0.45 0.000 0.34 0.440 0.79
    Row3 0.00 0.310 0.000 0.545 0.00 0.00 0.230 0.00 0.075 0.00
    Row4 0.00 0.100 0.395 0.760 0.24 0.00 0.070 0.42 0.300 0.46
     
  • pd.dataframe.groupby

      df.groupby([['row','col'])['val0','val1']。mean。
     

问题7

我可以通过多个列细分吗?

  • noreferrer“>

      df.pivot_table(
        values ='val0',index ='row',列= ['item','col'],,
        fill_value = 0,aggfunc ='mean')
    
    Item0 Item0 Item1项目2
    Col2 Col3 Col4 Col0 Col1 Col2 Col3 Col4 Col4 Col0 Col1 Col3 Col4 Col4
    排
    Row0 0.00 0.00 0.00 0.77 0.00 0.00 0.00 0.00 0.00 0.605 0.86 0.65
    Row2 0.35 0.00 0.37 0.00 0.00 0.44 0.00 0.00 0.13 0.000 0.50 0.50 0.13
    Row3 0.00 0.00 0.00 0.00 0.31 0.00 0.81 0.00 0.00 0.000 0.000 0.28 0.00
    Row4 0.15 0.64 0.00 0.00 0.10 0.64 0.88 0.24 0.00 0.000 0.000 0.00 0.00
     
  • pd.dataframe.groupby.groupby.groupbyby

      df.groupby(
        ['row','item','col']
    )['val0']。平均()。unstack(['item','col'])。填充(0).sort_index(1)
     

问题8

我可以通过多个列细分吗?

  • noreferrer“>

      df.pivot_table(
        values ='val0',index = ['键','row'],列= ['item','col'],,
        fill_value = 0,aggfunc ='mean')
    
    Item0 Item0 Item1项目2
    Col2 Col3 Col4 Col0 Col1 Col2 Col3 Col4 Col4 Col0 Col1 Col3 Col4 Col4
    钥匙行
    钥匙0行0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.86 0.00
         Row2 0.00 0.00 0.37 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.50 0.50 0.00
         Row3 0.00 0.00 0.00 0.00 0.31 0.00 0.81 0.00 0.00 0.00 0.00 0.00 0.00
         Row4 0.15 0.64 0.00 0.00 0.00 0.00 0.00 0.24 0.00 0.00 0.00 0.00 0.00
    KEY1 Row0 0.00 0.00 0.00 0.77 0.00 0.00 0.00 0.00 0.00 0.00 0.81 0.00 0.65
         Row2 0.35 0.00 0.00 0.00 0.00 0.44 0.00 0.00 0.00 0.00 0.00 0.00 0.13
         Row3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.28 0.00
         Row4 0.00 0.00 0.00 0.00 0.10 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
    键2行0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.40 0.00 0.00 0.00
         Row2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.13 0.00 0.00 0.00
         Row4 0.00 0.00 0.00 0.00 0.00 0.64 0.88 0.00 0.00 0.00 0.00 0.00 0.00
     
  • pd.dataframe.groupby.groupby.groupbyby

      df.groupby(
        ['键','row','item','col']
    )['val0']。平均()。unstack(['item','col'])。填充(0).sort_index(1)
     
  • pd.dataframe.dataframe.set_set_index_index 因为一组键是行和列

    的唯一

      df.set_index(
        ['键','row','item','col']
    )。
     

问题9

都是唯一的

我可以汇总列和行在一起的频率,又称“交叉表”?

  • noreferrer“>

      df.pivot_table(index ='row',columns ='col',fill_value = 0,aggfunc ='size')
    
    COL0 COL1 COL2 COL3 COL4
    排
    Row0 1 2 0 1 1
    Row2 1 0 2 1 2
    Row3 0 1 0 2 0
    Row4 0 1 2 2 1
     
  • pd.dataframe.groupby.groupby.groupbyby

      df.groupby(['row','col'])['val0']。size()。unstack(fill_value = 0)
     
  • pd.crosstab

      pd.crosstab(df ['row'],df ['col'])
     
  • p> pd.fact.factorize + + href =“ https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.bincount.html” rel =“ noreferrer”> np.bincount.bincount

     #获取整数分解`i i'和唯一值`r`
    #for专栏''row'
    i,r = pd.factorize(df ['row']。值)
    #获取整数分解`j`和唯一值`c`
    #for专栏`'col'
    j,c = pd.factorize(df ['col']。值)
    #`n`将是行的数量
    #`m`将是列的数量
    n,m = r.size,c.size
    #`i * m + j`是一种计数的巧妙方式
    #分解箱假定长度平坦
    #`n * m`。这就是为什么我们随后重塑为`(n,m)'
    b = np.bincount(i * m + j,minlength = n * m).Reshape(n,m)
    #顺便说一句,每当我读这篇文章时,我都认为“豆,米饭和奶酪”
    pd.dataframe(b,r,c)
    
          COL3 COL2 COL0 COL1 COL4
    Row3 2 0 0 1 0
    Row2 1 2 1 0 2
    Row0 1 0 1 2 1
    Row4 2 2 2 0 1 1
     
  • pd.get_dummies

      pd.get_dummies(df ['row'])。t.dot(pd.get_dummies(df ['col']))
    
          Col0 Col1 Col2 Col3 Col4
    Row0 1 2 0 1 1
    Row2 1 0 2 1 2
    Row3 0 1 0 2 0
    Row4 0 1 2 2 1
     

10

如何通过仅在两个上转换数据框
列?


问题11

如何在 pivot

之后将多个索引变成单个索引

如果 type object 使用字符串 join join

df.columns = df.columns.map('|'.join)

else else 格式

df.columns = df.columns.map('{0[0]}|{0[1]}'.format)

Here is a list of idioms we can use to pivot

  1. pd.DataFrame.pivot_table

    • A glorified version of groupby with more intuitive API. For many people, this is the preferred approach. And it is the intended approach by the developers.
    • Specify row level, column levels, values to be aggregated, and function(s) to perform aggregations.
  2. pd.DataFrame.groupby + pd.DataFrame.unstack

    • Good general approach for doing just about any type of pivot
    • You specify all columns that will constitute the pivoted row levels and column levels in one group by. You follow that by selecting the remaining columns you want to aggregate and the function(s) you want to perform the aggregation. Finally, you unstack the levels that you want to be in the column index.
  3. pd.DataFrame.set_index + pd.DataFrame.unstack

    • Convenient and intuitive for some (myself included). Cannot handle duplicate grouped keys.
    • Similar to the groupby paradigm, we specify all columns that will eventually be either row or column levels and set those to be the index. We then unstack the levels we want in the columns. If either the remaining index levels or column levels are not unique, this method will fail.
  4. pd.DataFrame.pivot

    • Very similar to set_index in that it shares the duplicate key limitation. The API is very limited as well. It only takes scalar values for index, columns, values.
    • Similar to the pivot_table method in that we select rows, columns, and values on which to pivot. However, we cannot aggregate and if either rows or columns are not unique, this method will fail.
  5. pd.crosstab

    • This a specialized version of pivot_table and in its purest form is the most intuitive way to perform several tasks.
  6. pd.factorize + np.bincount

    • This is a highly advanced technique that is very obscure but is very fast. It cannot be used in all circumstances, but when it can be used and you are comfortable using it, you will reap the performance rewards.
  7. pd.get_dummies + pd.DataFrame.dot

    • I use this for cleverly performing cross tabulation.

See also:


Question 1

Why do I get ValueError: Index contains duplicate entries, cannot reshape

This occurs because pandas is attempting to reindex either a columns or index object with duplicate entries. There are varying methods to use that can perform a pivot. Some of them are not well suited to when there are duplicates of the keys on which it is being asked to pivot. For example: Consider pd.DataFrame.pivot. I know there are duplicate entries that share the row and col values:

df.duplicated(['row', 'col']).any()

True

So when I pivot using

df.pivot(index='row', columns='col', values='val0')

I get the error mentioned above. In fact, I get the same error when I try to perform the same task with:

df.set_index(['row', 'col'])['val0'].unstack()

Examples

What I'm going to do for each subsequent question is to answer it using pd.DataFrame.pivot_table. Then I'll provide alternatives to perform the same task.

Questions 2 and 3

How do I pivot df such that the col values are columns, row values are the index, and mean of val0 are the values?

  • pd.DataFrame.pivot_table

    df.pivot_table(
        values='val0', index='row', columns='col',
        aggfunc='mean')
    
    col   col0   col1   col2   col3  col4
    row                                  
    row0  0.77  0.605    NaN  0.860  0.65
    row2  0.13    NaN  0.395  0.500  0.25
    row3   NaN  0.310    NaN  0.545   NaN
    row4   NaN  0.100  0.395  0.760  0.24
    
    • aggfunc='mean' is the default and I didn't have to set it. I included it to be explicit.

How do I make it so that missing values are 0?

  • pd.DataFrame.pivot_table

    • fill_value is not set by default. I tend to set it appropriately. In this case I set it to 0.
    df.pivot_table(
        values='val0', index='row', columns='col',
        fill_value=0, aggfunc='mean')
    
    col   col0   col1   col2   col3  col4
    row
    row0  0.77  0.605  0.000  0.860  0.65
    row2  0.13  0.000  0.395  0.500  0.25
    row3  0.00  0.310  0.000  0.545  0.00
    row4  0.00  0.100  0.395  0.760  0.24
    
  • pd.DataFrame.groupby

    df.groupby(['row', 'col'])['val0'].mean().unstack(fill_value=0)
    
  • pd.crosstab

    pd.crosstab(
        index=df['row'], columns=df['col'],
        values=df['val0'], aggfunc='mean').fillna(0)
    

Question 4

Can I get something other than mean, like maybe sum?

  • pd.DataFrame.pivot_table

    df.pivot_table(
        values='val0', index='row', columns='col',
        fill_value=0, aggfunc='sum')
    
    col   col0  col1  col2  col3  col4
    row
    row0  0.77  1.21  0.00  0.86  0.65
    row2  0.13  0.00  0.79  0.50  0.50
    row3  0.00  0.31  0.00  1.09  0.00
    row4  0.00  0.10  0.79  1.52  0.24
    
  • pd.DataFrame.groupby

    df.groupby(['row', 'col'])['val0'].sum().unstack(fill_value=0)
    
  • pd.crosstab

    pd.crosstab(
        index=df['row'], columns=df['col'],
        values=df['val0'], aggfunc='sum').fillna(0)
    

Question 5

Can I do more that one aggregation at a time?

Notice that for pivot_table and crosstab I needed to pass list of callables. On the other hand, groupby.agg is able to take strings for a limited number of special functions. groupby.agg would also have taken the same callables we passed to the others, but it is often more efficient to leverage the string function names as there are efficiencies to be gained.

  • pd.DataFrame.pivot_table

    df.pivot_table(
        values='val0', index='row', columns='col',
        fill_value=0, aggfunc=[np.size, np.mean])
    
         size                      mean
    col  col0 col1 col2 col3 col4  col0   col1   col2   col3  col4
    row
    row0    1    2    0    1    1  0.77  0.605  0.000  0.860  0.65
    row2    1    0    2    1    2  0.13  0.000  0.395  0.500  0.25
    row3    0    1    0    2    0  0.00  0.310  0.000  0.545  0.00
    row4    0    1    2    2    1  0.00  0.100  0.395  0.760  0.24
    
  • pd.DataFrame.groupby

    df.groupby(['row', 'col'])['val0'].agg(['size', 'mean']).unstack(fill_value=0)
    
  • pd.crosstab

    pd.crosstab(
        index=df['row'], columns=df['col'],
        values=df['val0'], aggfunc=[np.size, np.mean]).fillna(0, downcast='infer')
    

Question 6

Can I aggregate over multiple value columns?

  • pd.DataFrame.pivot_table we pass values=['val0', 'val1'] but we could've left that off completely

    df.pivot_table(
        values=['val0', 'val1'], index='row', columns='col',
        fill_value=0, aggfunc='mean')
    
          val0                             val1
    col   col0   col1   col2   col3  col4  col0   col1  col2   col3  col4
    row
    row0  0.77  0.605  0.000  0.860  0.65  0.01  0.745  0.00  0.010  0.02
    row2  0.13  0.000  0.395  0.500  0.25  0.45  0.000  0.34  0.440  0.79
    row3  0.00  0.310  0.000  0.545  0.00  0.00  0.230  0.00  0.075  0.00
    row4  0.00  0.100  0.395  0.760  0.24  0.00  0.070  0.42  0.300  0.46
    
  • pd.DataFrame.groupby

    df.groupby(['row', 'col'])['val0', 'val1'].mean().unstack(fill_value=0)
    

Question 7

Can I subdivide by multiple columns?

  • pd.DataFrame.pivot_table

    df.pivot_table(
        values='val0', index='row', columns=['item', 'col'],
        fill_value=0, aggfunc='mean')
    
    item item0             item1                         item2
    col   col2  col3  col4  col0  col1  col2  col3  col4  col0   col1  col3  col4
    row
    row0  0.00  0.00  0.00  0.77  0.00  0.00  0.00  0.00  0.00  0.605  0.86  0.65
    row2  0.35  0.00  0.37  0.00  0.00  0.44  0.00  0.00  0.13  0.000  0.50  0.13
    row3  0.00  0.00  0.00  0.00  0.31  0.00  0.81  0.00  0.00  0.000  0.28  0.00
    row4  0.15  0.64  0.00  0.00  0.10  0.64  0.88  0.24  0.00  0.000  0.00  0.00
    
  • pd.DataFrame.groupby

    df.groupby(
        ['row', 'item', 'col']
    )['val0'].mean().unstack(['item', 'col']).fillna(0).sort_index(1)
    

Question 8

Can I subdivide by multiple columns?

  • pd.DataFrame.pivot_table

    df.pivot_table(
        values='val0', index=['key', 'row'], columns=['item', 'col'],
        fill_value=0, aggfunc='mean')
    
    item      item0             item1                         item2
    col        col2  col3  col4  col0  col1  col2  col3  col4  col0  col1  col3  col4
    key  row
    key0 row0  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.86  0.00
         row2  0.00  0.00  0.37  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.50  0.00
         row3  0.00  0.00  0.00  0.00  0.31  0.00  0.81  0.00  0.00  0.00  0.00  0.00
         row4  0.15  0.64  0.00  0.00  0.00  0.00  0.00  0.24  0.00  0.00  0.00  0.00
    key1 row0  0.00  0.00  0.00  0.77  0.00  0.00  0.00  0.00  0.00  0.81  0.00  0.65
         row2  0.35  0.00  0.00  0.00  0.00  0.44  0.00  0.00  0.00  0.00  0.00  0.13
         row3  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.28  0.00
         row4  0.00  0.00  0.00  0.00  0.10  0.00  0.00  0.00  0.00  0.00  0.00  0.00
    key2 row0  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.40  0.00  0.00
         row2  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.13  0.00  0.00  0.00
         row4  0.00  0.00  0.00  0.00  0.00  0.64  0.88  0.00  0.00  0.00  0.00  0.00
    
  • pd.DataFrame.groupby

    df.groupby(
        ['key', 'row', 'item', 'col']
    )['val0'].mean().unstack(['item', 'col']).fillna(0).sort_index(1)
    
  • pd.DataFrame.set_index because the set of keys are unique for both rows and columns

    df.set_index(
        ['key', 'row', 'item', 'col']
    )['val0'].unstack(['item', 'col']).fillna(0).sort_index(1)
    

Question 9

Can I aggregate the frequency in which the column and rows occur together, aka "cross tabulation"?

  • pd.DataFrame.pivot_table

    df.pivot_table(index='row', columns='col', fill_value=0, aggfunc='size')
    
    col   col0  col1  col2  col3  col4
    row
    row0     1     2     0     1     1
    row2     1     0     2     1     2
    row3     0     1     0     2     0
    row4     0     1     2     2     1
    
  • pd.DataFrame.groupby

    df.groupby(['row', 'col'])['val0'].size().unstack(fill_value=0)
    
  • pd.crosstab

    pd.crosstab(df['row'], df['col'])
    
  • pd.factorize + np.bincount

    # get integer factorization `i` and unique values `r`
    # for column `'row'`
    i, r = pd.factorize(df['row'].values)
    # get integer factorization `j` and unique values `c`
    # for column `'col'`
    j, c = pd.factorize(df['col'].values)
    # `n` will be the number of rows
    # `m` will be the number of columns
    n, m = r.size, c.size
    # `i * m + j` is a clever way of counting the
    # factorization bins assuming a flat array of length
    # `n * m`.  Which is why we subsequently reshape as `(n, m)`
    b = np.bincount(i * m + j, minlength=n * m).reshape(n, m)
    # BTW, whenever I read this, I think 'Bean, Rice, and Cheese'
    pd.DataFrame(b, r, c)
    
          col3  col2  col0  col1  col4
    row3     2     0     0     1     0
    row2     1     2     1     0     2
    row0     1     0     1     2     1
    row4     2     2     0     1     1
    
  • pd.get_dummies

    pd.get_dummies(df['row']).T.dot(pd.get_dummies(df['col']))
    
          col0  col1  col2  col3  col4
    row0     1     2     0     1     1
    row2     1     0     2     1     2
    row3     0     1     0     2     0
    row4     0     1     2     2     1
    

Question 10

How do I convert a DataFrame from long to wide by pivoting on ONLY two
columns?

  • DataFrame.pivot

    The first step is to assign a number to each row - this number will be the row index of that value in the pivoted result. This is done using GroupBy.cumcount:

    df2.insert(0, 'count', df2.groupby('A').cumcount())
    df2
    
       count  A   B
    0      0  a   0
    1      1  a  11
    2      2  a   2
    3      3  a  11
    4      0  b  10
    5      1  b  10
    6      2  b  14
    7      0  c   7
    

    The second step is to use the newly created column as the index to call DataFrame.pivot.

    df2.pivot(*df2)
    # df2.pivot(index='count', columns='A', values='B')
    
    A         a     b    c
    count
    0       0.0  10.0  7.0
    1      11.0  10.0  NaN
    2       2.0  14.0  NaN
    3      11.0   NaN  NaN
    
  • DataFrame.pivot_table

    Whereas DataFrame.pivot only accepts columns, DataFrame.pivot_table also accepts arrays, so the GroupBy.cumcount can be passed directly as the index without creating an explicit column.

    df2.pivot_table(index=df2.groupby('A').cumcount(), columns='A', values='B')
    
    A         a     b    c
    0       0.0  10.0  7.0
    1      11.0  10.0  NaN
    2       2.0  14.0  NaN
    3      11.0   NaN  NaN
    

Question 11

How do I flatten the multiple index to single index after pivot

If columns type object with string join

df.columns = df.columns.map('|'.join)

else format

df.columns = df.columns.map('{0[0]}|{0[1]}'.format)

如何旋转数据框?

冷血 2025-02-19 23:51:21

我还弄清楚试图迭代收藏时做错了什么。这就是编写数组的方式:

执行脚本|返回[{name:“ angela”,age:“ 55”},{name:“ linda”,age:“ 50”}] | MyArray

foreach | MyArray |迭代器

回声| $ {iterator.age}
结束

此功能可用于同时迭代2个阵列。

I also figured out what I've been doing wrong when trying to iterate over a collection. This is how the array should have been written:

execute script | return [{name:"Angela",age:"55"},{name:"Linda",age:"50"}] | MyArray

forEach | MyArray | iterator

echo | ${iterator.age}
end

This works for iterating over 2 arrays at the same time.

硒IDE:如何在2个列表中同时迭代?我可以在集合上进行迭代

冷血 2025-02-19 18:46:32
for (let item of data) {
    CreateSkillToSkillRelation(item);
}

不在等待您创造的承诺,因此您基本上试图与仅支持单个并发事务的单个会话同时运行所有这些承诺。

您应该在> CreateSkilltoskillRyation 的每个呼叫中​​创建一个会话,或使用单个会话等待每个呼叫。

尽管请注意,您可以在> CreateSkilltoSkillRyation 的末尾关闭会话,但仅在成功时,我建议您将等待session.close.close(); 移动到最后一个块中。

for (let item of data) {
    CreateSkillToSkillRelation(item);
}

Is not awaiting the promises you create and so you are basically trying to run all of these promises concurrently against a single session which only supports a single concurrent transaction.

You should create a session in each call of CreateSkillToSkillRelation or await each call to it using a single session.

Though note you close the session at the end of CreateSkillToSkillRelation but only on success, might I suggest moving await session.close(); into a finally block.

循环在neo4j中创建或更新节点

冷血 2025-02-19 17:40:48
序言
这篇文章是易于阅读的 litb的帖子

基本目的是相同的;对“何时?”的解释和“为什么?” 必须应用和 template 。

typename 模板的目的是什么?

typename 模板在声明模板以外的其他情况下是可用的。

c ++ 中有某些上下文,必须明确地告诉编译器如何处理名称,并且所有这些上下文都有一个共同点;它们取决于至少一个模板参数

我们指的是解释中可能存在歧义的名称,为; “ 相关名称”。

这篇文章将为依赖名称和两个关键字之间的关系提供解释。


摘要说超过1000个单词

试图解释以下 function-template 对自己,朋友或您的猫的情况;标记( a )的语句中发生了什么?

template<class T> void f_tmpl () { T::foo * x; /* <-- (A) */ }



它可能并不像人们想象的那样容易,更具体地说是评估( a )的结果,重大 作为模板参数的定义 。

不同的 t 可以大大更改所涉及的语义。

struct X { typedef int       foo;       }; /* (C) --> */ f_tmpl<X> ();
struct Y { static  int const foo = 123; }; /* (D) --> */ f_tmpl<Y> ();


则两个不同的方案:

  • 如果我们用类型 x 实例化函数 - 板,

    ,如( c ),我们将声明 pointer-to int naty x ,但是;

  • 如果我们使用类型 y 实例 123 的乘积乘以一些已经声明的变量 x


C ++标准的理由

至少在这种情况下关心我们的安全和福祉。

为了防止实施潜在的令人讨厌的惊喜,我们通过 明确地来解决A 依赖名称的歧义的标准任务将名称视为A type-name 或A template-id

如果没有说明,则依赖性名称将被视为变量或函数。


如何处理依赖名称?

如果这是好莱坞电影,依赖性名称将是通过身体接触传播的疾病,会立即影响其宿主,使其混淆。混乱可能会导致一个形成不良的人,Erhm ..程序。

依赖性名称直接或间接取决于A 模板参数的任何名称。

template<class T> void g_tmpl () {
   SomeTrait<T>::type                   foo; // (E), ill-formed
   SomeTrait<T>::NestedTrait<int>::type bar; // (F), ill-formed
   foo.data<int> ();                         // (G), ill-formed    
}

我们在上面的片段中有四个依赖性名称:

  • e
    • “ type” 取决于的实例化, womentrait&lt; t&gt; ,其中包括 t 和;


  • f
    • “ nestedtrait” ,即 template-id ,取决于 witherrait&lt; t&gt; and;
    • “ type” 在( f )末尾取决于 nestedtrait ,它取决于 withrait&lt; t&gt; ,;


  • g
    • “ data” ,看起来像成员函数模板,是间接的依赖性名称,因为的类型foo 取决于的实例化, woryrait&lt; t&gt;


如果编译器会解释依赖性名称<,则语句( e ),( f )或( g )是有效的/em>作为变量/函数(如前所述,如果我们不明确说另有说明,就会发生这种情况)。

使 g_tmpl 具有有效定义的解决方案

,我们必须明确地告诉编译器,我们期望在( e ),( f )中的A template-id 和a type ,以及 template-id in ( g )。

template<class T> void g_tmpl () {
   typename SomeTrait<T>::type foo;                            // (G), legal
   typename SomeTrait<T>::template NestedTrait<int>::type bar; // (H), legal
   foo.template data<int> ();                                  // (I), legal
}

每次a name 表示类型, all name 必须是 type-names namespaces ,考虑到这一点,很容易看到我们在完全合格的名称开始时应用 typename

模板在这方面是不同的,因为没有办法得出结论,例如; “哦,这是一个模板,然后另一件事也必须是模板” 。这意味着我们直接在我们想这样对待的任何名称的前面应用模板>。


我可以将关键字贴在任何名称前面吗?

我可以粘贴 typename 模板在任何名称前?我不想担心它们出现的上下文。 。“ - 一些C ++开发人员

只要您要处理 commiquied -name -name k k <),标准中的规则可以应用关键字/em>),但是如果名称不合格的应用程序不正确( l )。

namespace N {
  template<class T>
  struct X { };
}

         N::         X<int> a; // ...  legal
typename N::template X<int> b; // (K), legal
typename template    X<int> c; // (L), ill-formed

注意:应用 typename 模板在不需要的上下文中被视为好练习;仅仅因为您可以做某事,并不意味着您应该做。

此外,在某些情况下, typename template 明确禁止:

  • 指定类继承的基础

    在派生类的 base-specifier-list 中编写的每个名称已经被视为 type-name ,明确指定 typename 均为形成不良和多余的。

      // .---------基本列表列表
      t&gt; lt; lt; lt; // v
      struct派生:typename wory wory&lt; t&gt; :: type / *&lt;  - 不构型 * / {
        ...
      };
     

  • template-id 是使用指导性

    中引用的

      struct base {
        t&gt; lt; lt; lt;
        struct类型{};
      };
    
      结构派生:基础{
        使用base ::模板类型; //不构造
        使用base ::类型; // 合法的
      };
     
Preface
This post is meant to be an easy-to-read alternative to litb's post.

The underlying purpose is the same; an explanation to "When?" and "Why?" typename and template must be applied.

What is the purpose of typename and template?

typename and template are usable in circumstances other than when declaring a template.

There are certain contexts in C++ where the compiler must explicitly be told how to treat a name, and all these contexts have one thing in common; they depend on at least one template-parameter.

We refer to such names, where there can be an ambiguity in interpretation, as; "dependent names".

This post will offer an explanation to the relationship between dependent-names, and the two keywords.


A snippet says more than 1000 words

Try to explain what is going on in the following function-template, either to yourself, a friend, or perhaps your cat; what is happening in the statement marked (A)?

template<class T> void f_tmpl () { T::foo * x; /* <-- (A) */ }



It might not be as easy as one thinks, more specifically the result of evaluating (A) heavily depends on the definition of the type passed as template-parameter T.

Different Ts can drastically change the semantics involved.

struct X { typedef int       foo;       }; /* (C) --> */ f_tmpl<X> ();
struct Y { static  int const foo = 123; }; /* (D) --> */ f_tmpl<Y> ();


The two different scenarios:

  • If we instantiate the function-template with type X, as in (C), we will have a declaration of a pointer-to int named x, but;

  • if we instantiate the template with type Y, as in (D), (A) would instead consist of an expression that calculates the product of 123 multiplied with some already declared variable x.


The Rationale

The C++ Standard cares about our safety and well-being, at least in this case.

To prevent an implementation from potentially suffering from nasty surprises, the Standard mandates that we sort out the ambiguity of a dependent-name by explicitly stating the intent anywhere we'd like to treat the name as either a type-name, or a template-id.

If nothing is stated, the dependent-name will be considered to be either a variable, or a function.


How to handle dependent names?

If this was a Hollywood film, dependent-names would be the disease that spreads through body contact, instantly affects its host to make it confused. Confusion that could, possibly, lead to an ill-formed perso-, erhm.. program.

A dependent-name is any name that directly, or indirectly, depends on a template-parameter.

template<class T> void g_tmpl () {
   SomeTrait<T>::type                   foo; // (E), ill-formed
   SomeTrait<T>::NestedTrait<int>::type bar; // (F), ill-formed
   foo.data<int> ();                         // (G), ill-formed    
}

We have four dependent names in the above snippet:

  • E)
    • "type" depends on the instantiation of SomeTrait<T>, which include T, and;
  • F)
    • "NestedTrait", which is a template-id, depends on SomeTrait<T>, and;
    • "type" at the end of (F) depends on NestedTrait, which depends on SomeTrait<T>, and;
  • G)
    • "data", which looks like a member-function template, is indirectly a dependent-name since the type of foo depends on the instantiation of SomeTrait<T>.

Neither of statement (E), (F) or (G) is valid if the compiler would interpret the dependent-names as variables/functions (which as stated earlier is what happens if we don't explicitly say otherwise).

The solution

To make g_tmpl have a valid definition we must explicitly tell the compiler that we expect a type in (E), a template-id and a type in (F), and a template-id in (G).

template<class T> void g_tmpl () {
   typename SomeTrait<T>::type foo;                            // (G), legal
   typename SomeTrait<T>::template NestedTrait<int>::type bar; // (H), legal
   foo.template data<int> ();                                  // (I), legal
}

Every time a name denotes a type, all names involved must be either type-names or namespaces, with this in mind it's quite easy to see that we apply typename at the beginning of our fully qualified name.

template however, is different in this regard, since there's no way of coming to a conclusion such as; "oh, this is a template, then this other thing must also be a template". This means that we apply template directly in front of any name that we'd like to treat as such.


Can I just stick the keywords in front of any name?

"Can I just stick typename and template in front of any name? I don't want to worry about the context in which they appear..." - Some C++ Developer

The rules in the Standard states that you may apply the keywords as long as you are dealing with a qualified-name (K), but if the name isn't qualified the application is ill-formed (L).

namespace N {
  template<class T>
  struct X { };
}

         N::         X<int> a; // ...  legal
typename N::template X<int> b; // (K), legal
typename template    X<int> c; // (L), ill-formed

Note: Applying typename or template in a context where it is not required is not considered good practice; just because you can do something, doesn't mean that you should.

Additionally there are contexts where typename and template are explicitly disallowed:

  • When specifying the bases of which a class inherits

    Every name written in a derived class's base-specifier-list is already treated as a type-name, explicitly specifying typename is both ill-formed, and redundant.

                        // .------- the base-specifier-list
      template<class T> // v
      struct Derived      : typename SomeTrait<T>::type /* <- ill-formed */ {
        ...
      };
    

  • When the template-id is the one being referred to in a derived class's using-directive

      struct Base {
        template<class T>
        struct type { };
      };
    
      struct Derived : Base {
        using Base::template type; // ill-formed
        using Base::type;          // legal
      };
    

我必须在何处以及为什么要放置“模板”。和“ typename”关键字?

冷血 2025-02-19 17:02:38

从数据框架中减去列 a 然后除以列 a 以计算pct_change:

df.sub(df['A'], axis=0).div(df['A'], axis=0)

上述表达式可以进一步简化为:

df.div(df['A'], axis=0).sub(1)

      A          B          C          D
0   0.0  -0.821429   1.535714   0.500000
1   0.0   0.491525   0.508475  -0.745763
2   0.0  -0.452055   0.013699  -0.452055
3   0.0   2.187500   0.062500   0.812500
4   0.0  -0.632184  -0.839080   0.114943
5   0.0  -0.042105  -0.378947  -0.157895
6   0.0  -0.553191  -0.734043  -0.319149
...
98  0.0  -0.604651  -0.325581  -0.418605
99  0.0   0.649123  -0.964912  -0.631579

Subtract column A from the dataframe then divide by column A to calculate pct_change:

df.sub(df['A'], axis=0).div(df['A'], axis=0)

The above expression can be further simplied to:

df.div(df['A'], axis=0).sub(1)

      A          B          C          D
0   0.0  -0.821429   1.535714   0.500000
1   0.0   0.491525   0.508475  -0.745763
2   0.0  -0.452055   0.013699  -0.452055
3   0.0   2.187500   0.062500   0.812500
4   0.0  -0.632184  -0.839080   0.114943
5   0.0  -0.042105  -0.378947  -0.157895
6   0.0  -0.553191  -0.734043  -0.319149
...
98  0.0  -0.604651  -0.325581  -0.418605
99  0.0   0.649123  -0.964912  -0.631579

Pandas PCT在2列之间更改,更换原始

冷血 2025-02-18 11:59:50

您需要外部IP来从外部群集访问群集。您需要的是外部IP:端口以访问群集中的豆荚。

要获取外部IP,请更改服务中的类型。YAML从NodePort到LoadBalancer,然后运行“ Kubectl Get Service”,您应该看到外部IP

LoadBalancer是将流量从Internet到群集中的Pods,并加载平衡的原因豆荚。

you need the External IP to access the cluster from the outside the cluster. what you need is external-Ip:port to access the pods in the cluster.

To get the external IP, change the type in your service.yaml from NodePort to LoadBalancer then run "kubectl get service" You should see the external Ip

LoadBalancer is what directs traffic from the internet to your pods in the cluster and also load balances the pods.

裸露的Kubernetes服务港不起作用

冷血 2025-02-18 03:58:52

添加此行: minio_opts =“ - certs-dir/home/swaggmode/.minio/certs -console-address:9001” 到位于/etc/etc/eetc/default/default/default/default/ Minio 应使Minio控制台重定向到端口9001或您想要的任何特定端口。

Adding this line: MINIO_OPTS="--certs-dir /home/swaggmode/.minio/certs --console-address :9001" to the config file located at /etc/default/minio should make minio console to redirect to port 9001 or any specific port you want.

Kubernetes中的Minio部署:控制台重定向

更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

更多

友情链接

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文